除了传递参数和绑定之外,有没有办法改变块/方法中传递的对象以使更改反映在初始对象中?
想象一下,要求是转换以下内容:
{one:1, two:2, three:3, four:4}
加入{one:"1", two:"22", three:"333", four:"4444"}
我在考虑这样的事情:
{one:1, two:2, three:3, four:4}.each!{ |k,v| v = v.to_s * v }
传递变量的更改会反映在实际哈希中。
我认为可能甚至可以提高这样的能力吗?这样块就可以直接对这些对象进行管理,而不必创建新对象,然后将其分配给它。
以某种方式感觉解决这样的问题涉及对象数据类型的多次不必要的更改,并且可能效率低下:
new_hash = Hash[{one:1, two:2, three:3, four:4}.collect{ |k,v| [k, v.to_s * v] }]
所以想知道,是否有类似的东西!这样做。
答案 0 :(得分:2)
我不知道有什么像each!
,但这应该可以完成你想要做的事情:
test = {one:1, two:2, three:3, four:4}
test.each{ |key,val| test[key] = val.to_s * val }
p test
#=> {:one=>"1", :two=>"22", :three=>"333", :four=>"4444"}