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

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=value

   end

   def value

       @value

   end

 注意到没,返回的直接是@value,所以会修改对象里面的value值,不知道对不对希望高手来看看。

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 #result: 3 5875824 3 5875824 3 5875704 1 "Mr.w" 3 5875704

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

 

你可能感兴趣的:(Ruby)