论坛首页 编程语言技术论坛

ruby一小段代码测测你的引用类型功力

浏览 2567 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-07-28  
class Fixnum
   attr_accessor :value
end

x=1
p x.object_id
x.value="Anleb"
p x.value.object_id
def change(x)
    p x.object_id    
    p x.value.object_id
    #x=2
    x.value="Mr.w"
    p x.object_id
    p x.value.object_id
end

change x
p x
p x.value


p x.object_id
p x.value.object_id


打印:
3
5875824
3
5875824
3
5875704
1
"Mr.w"
3
5875704



大大们再论坛上已经把这个方法传递的是值,还是引用,都说尽了,这里不说基础了。
看代码,如果#x=2不注释,代码的结果又是一种如下:
class Fixnum
   attr_accessor :value
end

x=1
p x.object_id
x.value="Anleb"
p x.value.object_id
def change(x)
    p x.object_id   
    p x.value.object_id
    x=2        #指针改变
    x.value="Mr.w"
    p x.object_id
    p x.value.object_id  
    #x改变的指针在这里被GC回收
end


change x
p x
p x.value
p x.object_id
p x.value.object_id
打印
3
22950360
3
22950360
5
22950290
1
"Anleb"
3
22950360


这段代码好理解,因为这就是我们很平常的方法无法改变传递进去的值的案例,具体不说,原因都知道是 方法内部变量改变了指针,退出方法的时候,指针销毁,然后x回到顶级域x又是原来的指针。


现在来说说,为什么注释掉了#x=2,结果会改变呢,这个问题出在attr_accessor :value
这个代码相当于:
   def value=(value)
       @value
   end
   def value
       @value
   end


注意到没,返回的直接是@value,所以会修改对象里面的value值,不知道对不对希望高手来看看。
   发表时间:2012-09-21  
>>为什么注释掉了#x=2,结果会改变呢,这个问题出在attr_accessor :value

这个好像没有关系吧。

传递的是引用。把change(x)改成change(y)更能理解一点。
所以外部的x和change内部的x只是值相同而已,代表它们指向同一个地方。
x=2后change内x的值就改变了,但外部的x的值没有变
0 请登录后投票
   发表时间:2012-09-24   最后修改:2012-09-25
瞎扯淡,1本身就是一个数字,还给他定义一个value方法。纯粹误导大众。

至少也要把 value 定义成 attr_reader:value(只读的),返回也要是 self .

就像 1.ord 和 97.chr 那样只读的。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics