显然,ruby 似乎是一种传递参考语言:
$ irb --simple-prompt
>> @foo=1
=> 1
>> @bar=2
=> 2
>> @foo.object_id
=> 3
>> @bar.object_id
=> 5
>> [@foo,@bar].each {|e| puts e.object_id }
3
5
=> [1, 2]
即,构造数组和块似乎都处理对原始类实例变量对象的引用。
但是,一旦我尝试写入这些引用,它们似乎就会创建副本:
>> [@foo,@bar].each {|e| puts e+=1 }
2
3
=> [1, 2]
>> @foo
=> 1
>> @bar
=> 2
>> [@foo,@bar].map! {|e| e+1 }
=> [2, 3]
>> @foo
=> 1
>> @bar
=> 2
我有一些类实例变量对象,我需要通过一个函数进行转换,所以我想我可以通过使用传递引用的东西来保存击键,并执行以下操作:
[@var1, @var2, @var3].map! {|v| my_function(v) }
但由于似乎正在发生这种写时复制的事情,它似乎不起作用。
有没有办法关掉它?您将如何在保持代码干燥和高效的同时完成我的工作?