提问人:rpechayr 提问时间:10/30/2014 最后编辑:Communityrpechayr 更新时间:10/30/2014 访问量:102
Ruby 修改 “each” 块中的哈希值。按价值传递的微妙之处?[复制]
Ruby modify hash in "each" block. Pass-by-value subtlety ? [duplicate]
问:
根据这个问题,红宝石是严格按值传递的。不过,我遇到了一个案例,其中包括像这样修改哈希:
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"}
我怎么能预料到这一点?
答:
7赞
Linuxios
10/30/2014
#1
如果您阅读链接的答案中的下一段,它会这样说:
Ruby 没有任何纯的、非引用值的概念,所以你当然不能把一个值传递给方法。变量始终是对对象的引用。为了得到一个不会从你下面改变的对象,你需要复制或克隆你传递的对象,从而给出一个其他人没有引用的对象。
运算符就地修改数组。你有对数组的引用,哈希对该数组有引用,当数组发生变化时,它们都指向同一个数组。<<
使用时,您正在为变量赋值。在某种程度上,你是在告诉变量引用其他东西,而不是对变量引用的东西做一些事情。=
评论