变量不包含值,它们引用它们。当你写:
foo = 2
bar = [foo]
foo = 4
......它不会bar
导致[4]
。〜发生的是:
2
在内存中创建一个值并设置变量foo
以引用它。
- 创建一个新数组,其第一个槽引用
foo
(ie 2
) 引用的值,并将变量设置bar
为引用该数组。
- 在内存中创建一个值
4
并更改变量foo
以引用它。
一些可变的对象类型。例如,您可以将 String 或 Array 的实际内容更改为不同的内容。在这种情况下,对该值的所有引用都反映了更改:
foo = "hello"
bar = [foo]
foo[0] = "j"
p bar #=> ["jello"]
然而,数字是不可变的。如果您想要一个数字的“句柄”而不是您可以更改的数字并且对该数字的所有其他引用都更改,则需要将该数字包装在可变数据类型中。例如:
$var1 = [2]
keywords = { "one"=>$var1 }
p keywords["one"][0] #=> 2
$var1[0] = 4
p keywords["one"][0] #=> 4
现在,如果您的值不是数字,而是字符串(正如“关键字”所暗示的那样),那么您可以改变并完全替换它们:
$var1 = "foo"
keywords = { "one"=>$var1 }
$var1.replace( "bar" )
p keywords["one"] #=> "bar"
关键是您必须调用对象本身的方法(并且该方法必须更改对象本身,而不是返回新对象);你不能使用变量赋值来完成这项工作。例如,请参阅String#replace
。