• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
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不注释,代码的结果又是一种如下:

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap