设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2352|回复: 13
打印 上一主题 下一主题

[有事请教] RUBY中如何顯式地對整數變量建立引用變量?

[复制链接]

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
跳转到指定楼层
1
发表于 2013-3-27 12:12:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
如果是類實例只要在初始化變量時直接以目標變量初始化,就會自動建立引用關係。但是對於整數等基礎類型則是副本。如何對整數變量顯式地創建引用變量?

点评

对了,这里水一笔,很喜欢你个性签名的那句话。  发表于 2013-3-27 20:26
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。

Lv1.梦旅人

梦石
0
星屑
38
在线时间
1165 小时
注册时间
2012-3-16
帖子
5336
2
发表于 2013-3-27 12:30:12 | 只看该作者
话说我现在才注意到你的头像是百变小樱...
我想要到的是保护同伴的力量,能与同伴一起欢笑的未来的力量,如果无法做到的话,那就无需继承,如果是这样的彭格列的话,那我亲手毁掉它!
  
                       欢迎加入我们的家族~
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
3
 楼主| 发表于 2013-3-27 18:44:44 | 只看该作者
彭格列第XI代 发表于 2013-3-27 12:30
话说我现在才注意到你的头像是百变小樱...

我就是知世

点评

知道  发表于 2013-3-27 20:16
我是说那部动漫~  发表于 2013-3-27 20:08
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

4
发表于 2013-3-27 19:07:29 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
5
 楼主| 发表于 2013-3-27 19:15:24 | 只看该作者
晴兰 发表于 2013-3-27 19:07
很粗糙的一个写法,另Ruby1.9才有BasicObject,如果是Ruby1.8就干脆去掉这个继承,同时undef一堆奇怪的方法 ...

這個是手動裝箱,必須修改目標變量的定義為該類才行,RUBY對整數等基礎類型沒有自動裝箱拆箱的麼?

点评

自动装箱对于Ruby可能意义不大,因为Ruby更多地是鸭子类型,只要我的变量能响应你的方法,不一定定义成什么类型,目标变量修不修改类型没有影响。  发表于 2013-3-27 19:17
拆箱是to_int, 仅限必须强制int的地方,比方说RGSS底层Sprite设置x坐标,会自动调用to_int拆箱  发表于 2013-3-27 19:17
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
6
 楼主| 发表于 2013-3-27 19:19:59 | 只看该作者
晴兰 发表于 2013-3-27 19:07
很粗糙的一个写法,另Ruby1.9才有BasicObject,如果是Ruby1.8就干脆去掉这个继承,同时undef一堆奇怪的方法 ...

class Ref
  attr_accessor :obj
  def initialize(obj)
    @obj = obj
  end
  def method_missing(sym, *args)
    obj.send sym, *args
  end

  def to_int
    obj
  end
  def to_str
    obj
  end
  def to_ary
    obj
  end
end

ss = 5
a = Ref.new(ss)
ss = 6
p a
---------------------
輸出為 #<Ref:0x1c357a8 @obj=5>
而不是 ss的6

点评

相当于a是变量,ss是3;而并非ss是变量,a=&ss。  发表于 2013-3-27 19:37
不是,就算是在java或者C#里面你这样写结果也是不变的。如果你想把改成6反映到别的地方去,见我下面那个例子。  发表于 2013-3-27 19:36
ss = 5 a = Ref.new(ss) a = 6 p ss 改成這樣輸出也是5  发表于 2013-3-27 19:31
这个写法中a是所谓的‘引用’,要修改的是a而不是ss  发表于 2013-3-27 19:20
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

7
发表于 2013-3-27 19:24:45 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
480
在线时间
177 小时
注册时间
2006-10-3
帖子
618
8
 楼主| 发表于 2013-3-27 19:38:30 | 只看该作者
晴兰 发表于 2013-3-27 19:24
其实老代码里面的等号会出问题,可以有多种方式来解决
比方说下面的v = 换成v[]=
v+=3换成v[] += 3

class Ref
  attr_accessor :obj
  def initialize(obj)
    @obj = obj
  end
  def method_missing(sym, *args)
    obj.send sym, *args
  end

  def to_int
    obj
  end
  def to_str
    obj
  end
  def to_ary
    obj
  end
end

a = Ref.new(5)
ss = a
ss.obj = 6
p a

這樣輸出6

点评

其实主要是Ruby不能重载等号,要不然管他三七二十一重载了就没有这么多考虑了,在等号里面写装拆箱的代码就行了……  发表于 2013-3-27 19:44
也就是說 這個手動裝箱後導致 a 和 ss 都是同一個 類實例 的引用,而我雖然知道這樣可以引用整數,可是這樣要求改變目標變量聲明方式 太麻煩  发表于 2013-3-27 19:44
这就相当于为6创建一个变量了。。如果ss=6的话ss只是6的别名,根本没有C意义上的变量  发表于 2013-3-27 19:40
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

9
发表于 2013-3-27 19:46:12 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1150
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

10
发表于 2013-3-27 20:22:17 | 只看该作者
本帖最后由 DeathKing 于 2013-3-27 20:23 编辑


RUBY 代码复制
  1. a = 1
  2. id = a.obejct_id #=> 3
  3. ObjectSpace._id2ref(id).inspect #=> "1"


你还是换个解决方法吧,总赶觉这样很丑陋。


囧,用成quote标签了。

点评

发现DK大大。。其实整数的id也是和值密切相关的吧……  发表于 2013-3-27 20:36

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-9-28 11:14

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表