我有以下代码:
session={"apple"=>["bp", "80APPM", "donald"]}
@like_list = session
@like_list.each do |key, value|
value.each_with_index do |v, i|
@like_list[key][i] = 2
end
end
session # => {"apple"=>[2, 2, 2]}
@like_list # => {"apple"=>[2, 2, 2]}
分配给变量session
和@like_list
的对象都已更改。有没有办法在不改变session
的价值的情况下执行上述代码?
我尝试使用clone
和dup
,但没有更改
答案 0 :(得分:1)
您需要复制原始哈希值,以防止两个变量引用同一个对象。
@like_list = session.map { |key, value| [key, value.clone] }.to_h
答案 1 :(得分:1)
这有效:
session={"apple"=>["bp", "80APPM", "donald"]}
@like_list = Marshal.load(Marshal.dump(session))
@like_list.each do |key, value|
value.each_with_index do |v, i|
@like_list[key][i] = 2
end
end
它使用此SO问题中的Marshal.load(Marshal.dump(session))
解决方案:Ruby dup/clone recursively
答案 2 :(得分:0)
使用Hash.deep_dup
。
@like_list = session.deep_dup
该方法
编辑:
此方法来自activesupport
库,它包含在Rails中。正如评论中所建议的那样,这种方法过去是有问题的,但是as of Rails 4,它的表现更为明显。我测试了上面的示例,它适用于activesupport 4.2.3
。
如果您不使用Rails,则需要加载activesupport:
require 'active_support'