Ruby 修改"each"块中的哈希。按值传递的微妙之处?



根据这个问题,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没有任何纯的、非引用值的概念,所以您当然不能将其传递给方法。变量始终是对对象的引用。为了得到一个不会从你身下改变的对象,你需要对你传递的对象进行复制或克隆,从而得到一个其他人都没有引用的对象。

<<运算符在适当的位置修改数组。您有一个对数组的引用,散列有一个对此数组的引用。当数组发生变化时,它们都指向同一个数组。

当您使用=时,您正在为变量赋值。在某种程度上,你是在告诉变量引用其他东西,而不是对变量引用的东西做一些事情。

最新更新