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值,不知道对不对希望高手来看看。
分享到:
相关推荐
ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码
ruby测试代码6
博客“ruby+selenium-webdriver测试--多个测试用例”源代码
ruby测试代码1
ruby源代码 ruby源代码 ruby源代码 ruby源代码2
ruby源代码 ruby源代码 ruby源代码 ruby源代码4
ruby测试代码7
ruby源代码 ruby源代码 ruby源代码 ruby源代码3
博客“ruby+selenium-webdriver测试--第一个例子源代码”
博客“ruby+selenium-webdriver测试-测试用例源代码”
ruby测试代码 ruby测试代码 ruby测试代码 ruby测试代码
ruby测试代码5
ruby测试代码2
ruby测试代码4
ruby源代码 ruby源代码 ruby源代码 ruby源代码5
Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试 Ruby性能测试
ruby水平测试 ruby水平测试 ruby水平测试 ruby水平测试 ruby水平测试
ruby实战书、代码书.rarruby实战书、代码书.rar
Referral是一个CLI,可帮助您进行Ruby代码库的复杂分析和重构。 它在整个代码中查找,过滤和排序大多数类型的Ruby标识符(例如类,方法和变量)的定义和引用。
博客“ruby+selenium-webdriver一步一步进行自动化测试------面向对象编程”对应源代码