Project1

标题: RUBY中如何顯式地對整數變量建立引用變量? [打印本页]

作者: 流川枫    时间: 2013-3-27 12:12
标题: RUBY中如何顯式地對整數變量建立引用變量?
如果是類實例只要在初始化變量時直接以目標變量初始化,就會自動建立引用關係。但是對於整數等基礎類型則是副本。如何對整數變量顯式地創建引用變量?
作者: 彭格列第XI代    时间: 2013-3-27 12:30
话说我现在才注意到你的头像是百变小樱...
作者: 流川枫    时间: 2013-3-27 18:44
彭格列第XI代 发表于 2013-3-27 12:30
话说我现在才注意到你的头像是百变小樱...

我就是知世
作者: 晴兰    时间: 2013-3-27 19:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: 流川枫    时间: 2013-3-27 19:15
晴兰 发表于 2013-3-27 19:07
很粗糙的一个写法,另Ruby1.9才有BasicObject,如果是Ruby1.8就干脆去掉这个继承,同时undef一堆奇怪的方法 ...

這個是手動裝箱,必須修改目標變量的定義為該類才行,RUBY對整數等基礎類型沒有自動裝箱拆箱的麼?
作者: 流川枫    时间: 2013-3-27 19:19
晴兰 发表于 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
作者: 晴兰    时间: 2013-3-27 19:24
提示: 作者被禁止或删除 内容自动屏蔽
作者: 流川枫    时间: 2013-3-27 19:38
晴兰 发表于 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
作者: 晴兰    时间: 2013-3-27 19:46
提示: 作者被禁止或删除 内容自动屏蔽
作者: DeathKing    时间: 2013-3-27 20:22
本帖最后由 DeathKing 于 2013-3-27 20:23 编辑


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


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


囧,用成quote标签了。
作者: 紫苏    时间: 2013-3-28 04:55
流川枫 发表于 2013-3-27 19:38
class Ref
  attr_accessor :obj
  def initialize(obj)

哈哈~前幾天才和人討論過這個問題,在 Ruby/Python/Java 中所謂的傳遞引用和 C++ 中的傳遞引用是不同的,在 Python 社區這個概念被稱為「call by sharing」,但在 Ruby 和 Java 社區這個概念依然被稱為「call by reference」……

詳見 http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing
作者: DeathKing    时间: 2013-3-28 20:56
晴兰 发表于 2013-3-27 19:46
你可以把想要的声明方式写出来,然后再考虑实现。
Ruby最大的代码库是Ruby On Rails,如果读他的代码就会 ...

Fixnum类的object_id是可以算的,公式是:值*2 + 1。
作者: 晴兰    时间: 2013-3-28 21:34
提示: 作者被禁止或删除 内容自动屏蔽
作者: 晴兰    时间: 2013-3-28 22:38
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1