class Fixnum attr_accessor :valueendx=1p x.object_idx.value="Anleb"p x.value.object_iddef 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回收endchange xp xp x.valuep x.object_idp x.value.object_id列印3229503603229503605229502901"Anleb"322950360
這段代碼好理解,因為這就是我們很平常的方法無法改變傳遞進去的值的案例,具體不說,原因都知道是 方法內部變數改變了指標,退出方法的時候,指標銷毀,然後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不注釋,代碼的結果又是一種如下: