【问题标题】:Why Array.new(3, []) works differently than [[], [], []] in Ruby? [duplicate]为什么 Array.new(3, []) 与 Ruby 中的 [[], [], []] 工作方式不同? [复制]
【发布时间】:2017-03-06 00:23:42
【问题描述】:

谁能给我解释一下:

irb(main):001:0> a = Array.new(3, [])                      
=> [[], [], []]                                           

irb(main):001:0> b = [[], [], []]                         
=> [[], [], []]                                           

irb(main):003:0> a.each_with_index{ |r, idx| r << 'a' }   
=> [["a", "a", "a"], ["a", "a", "a"], ["a", "a", "a"]]    

irb(main):004:0> b.each_with_index{ |r, idx| r << 'a' }   
=> [["a"], ["a"], ["a"]]                                  

【问题讨论】:

标签: ruby


【解决方案1】:

当使用.new 方法时:

由于所有 Array 元素都存储相同的哈希值,因此对其中一个元素的更改将影响所有元素。

如果你想要多个副本,你应该使用每次需要初始化数组元素时使用该块结果的块版本:

2.3.0 :001 > a = Array.new(3) { [] }
 => [[], [], []]
2.3.0 :002 > a.each_with_index{ |r, idx| r << 'a' }
 => [["a"], ["a"], ["a"]]

在此处阅读示例 - https://ruby-doc.org/core-2.2.0/Array.html#method-c-new

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 2015-11-01
    • 2014-09-04
    相关资源
    最近更新 更多