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
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=value
end
def value
@value
end


注意到没,返回的直接是@value,所以会修改对象里面的value值,不知道对不对希望高手来看看。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值