根据这个问题,ruby是严格按值传递的。不过,我遇到了一个案例,它包括修改这样的散列:
h = {"one" => ["un", "ein"], "two"=> ["deux", "zwei"]}
h.each { |k,v| v << "overriden"}
导致:
{"one"=>["un", "ein", "overriden"], "two"=>["deux", "zwei", "overriden"]}
然而,以下行为不同:
h = {"one" => "un", "two"=> "deux"}
h.each { |k,v| v = "overriden"}
导致:
{"one"=>"un", "two"=>"deux"}
我怎么能预料到呢?
如果你阅读链接的答案中的下一段,它会说:
Ruby没有任何纯的、非引用值的概念,所以您当然不能将其传递给方法。变量始终是对对象的引用。为了得到一个不会从你身下改变的对象,你需要对你传递的对象进行复制或克隆,从而得到一个其他人都没有引用的对象。
<<
运算符在适当的位置修改数组。您有一个对数组的引用,散列有一个对此数组的引用。当数组发生变化时,它们都指向同一个数组。
当您使用=
时,您正在为变量赋值。在某种程度上,你是在告诉变量引用其他东西,而不是对变量引用的东西做一些事情。