【问题标题】:Ruby: How to copy the multidimensional array in new array?Ruby:如何将多维数组复制到新数组中?
【发布时间】:2015-06-22 06:25:45
【问题描述】:

座位安排 [ [:first, :second, :none], [:first, :none, :second], [:second, :second, :first], ]

我需要将此数组复制到新数组中。我尝试通过以下代码来做到这一点:

class Simulator
 @@current_state

def initialize(seating_arrangement)
  @@current_state = seating_arrangement.dup
end

但每当我对seating_arrangement 进行任何更改时,current_state 都会自动更改。我想单独保留current_state。我是ruby 的新手。请在这里帮助我

【问题讨论】:

    标签: ruby-on-rails arrays ruby multidimensional-array


    【解决方案1】:

    dup 不创建深拷贝,它只复制最外层的对象。来自该文档:

    产生 obj 的浅拷贝——拷贝 obj 的实例变量,但不拷贝它们引用的对象。 dup 复制 obj 的污染状态。

    如果您不确定对象的嵌套深度,那么创建深拷贝的最简单方法可能是对对象进行序列化和反序列化:

    @@current_state = Marshal.load(Marshal.dump(seating_arrangement))
    

    【讨论】:

      【解决方案2】:
      def initialize(seating_arrangement)
        @@current_state = seating_arrangement.map(&:dup)
      end
      

      【讨论】:

      • 并使用实例变量@current_state而不是类变量@@current_state
      • @sawa 是最好的^.^
      • @sawa 感谢您的回复,但我在以下代码中遇到异常:prev_state = @@current_state.map (&:dup) 即意外 & (SyntaxError) prev_state 是方法中的另一个局部变量
      • 小心...此解决方案仅限于二维数组,该数组仅包含响应 #dup... 的对象,即将符号混合到数组中会引发异常并具有第三维,甚至第二维内的字符串也会创建一个浅拷贝 ([ ["this won't be copied"], :raises_an_exception])。
      【解决方案3】:

      如果您使用 Rails 4.x 或更高版本,只需使用:

       array.deep_dup
      

      See doc.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-19
        • 2015-06-09
        • 2017-12-15
        • 1970-01-01
        相关资源
        最近更新 更多