Ruby 修改 “each” 块中的哈希值。按价值传递的微妙之处?[复制]

Ruby modify hash in "each" block. Pass-by-value subtlety ? [duplicate]

提问人:rpechayr 提问时间:10/30/2014 最后编辑:Communityrpechayr 更新时间:10/30/2014 访问量:102

问:

根据这个问题,红宝石是严格按值传递的。不过,我遇到了一个案例,其中包括像这样修改哈希:

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 按值传递

评论

0赞 mu is too short 10/30/2014
对不起,但我们没有一遍又一遍地回答这个问题。
0赞 rpechayr 10/30/2014
@muistooshort认真的?你可能已经注意到,这个问题是关于我如何预测这种行为的。所以这真的不是其他人的问题。我把它发布在 stackoverflow 上,以分享我的经验,并允许其他人找到示例,让他们理解按值传递模式的微妙之处。你认为我可以把标题改成问题吗?
0赞 mu is too short 10/30/2014
是的,对我来说一遍又一遍地看起来像同样的事情。如果您愿意,欢迎其他人重新开业。
0赞 rpechayr 10/30/2014
我怎么会找到这个人?
0赞 rpechayr 10/30/2014
你认为新标题不会让它一遍又一遍地看起来像同样的东西吗?

答:

7赞 Linuxios 10/30/2014 #1

如果您阅读链接的答案中的下一段,它会这样说:

Ruby 没有任何纯的、非引用值的概念,所以你当然不能把一个值传递给方法。变量始终是对对象的引用。为了得到一个不会从你下面改变的对象,你需要复制或克隆你传递的对象,从而给出一个其他人没有引用的对象。

运算符就地修改数组。你有对数组的引用,哈希对该数组有引用,当数组发生变化时,它们都指向同一个数组。<<

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