ruby一小段代碼測測你的參考型別功力

來源:互聯網
上載者:User
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不注釋,代碼的結果又是一種如下:

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.