保持“each”方法中两个变量的值

时间:2016-05-16 00:38:01

标签: ruby

我有以下代码:

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的价值的情况下执行上述代码?

我尝试使用clonedup,但没有更改

3 个答案:

答案 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
该方法

Here is the documentation

编辑:

此方法来自activesupport库,它包含在Rails中。正如评论中所建议的那样,这种方法过去是有问题的,但是as of Rails 4,它的表现更为明显。我测试了上面的示例,它适用于activesupport 4.2.3

如果您不使用Rails,则需要加载activesupport

require 'active_support'