【问题标题】:Adding value to only one slot [duplicate]仅向一个插槽添加价值[重复]
【发布时间】:2015-12-09 12:07:35
【问题描述】:

我正在尝试将值添加到数组中的单个插槽。例如:

a = Array.new(3,[])    # => [[],[],[]]
a[1] << "value"        # => [[],["value"],[]]

但是,值会添加到数组中的所有槽中。

# => [["value"],["value"],["value"]]

这种行为有原因吗?是否有一种标准方法可以向数组添加值以避免这种行为?

【问题讨论】:

  • 您遇到了一个“常见问题”,文档中对此进行了解释:ruby-doc.org/core-2.2.0/…
  • "common gotcha's" 我希望这是一个常见错误列表,但仅此而已。无论如何,谢谢!

标签: arrays ruby immutability


【解决方案1】:

您会看到这种行为,因为新数组引用同一个对象。您可以验证查看子数组的object_ids:

a = Array.new(3, [])
p a[1] << "value"
p a[0].object_id
# => 70175034559160
p a[1].object_id
# => 70175034559160
p a[2].object_id
# => 70175034559160

你可以这样做:

a = []
(1..3).each { |e| a << [] }
a[1] << "value"
p a
# => [[], ["value"], []]

或者,更好地使用这个:

a = Array.new(3) { Array.new }

如评论区@orde提供的the documentation所示。

【讨论】:

  • 我将如何为数组的每个插槽赋予不同的值?
  • 请看我更新的代码。
  • 这个答案比这里的“重复”要好得多:stackoverflow.com/questions/21051442/…
  • 感谢您的链接。我认为来自 OP 的“喜欢”总是标记为绿色的。但现在我知道其中的细微差别了。
  • 很高兴听到它消除了您的困惑,现在您了解了这两者之间的区别 :) 学习愉快 :)
【解决方案2】:

你可以像这样初始化你的数组,以确保每个元素都有自己的数组:

a = Array.new(3){ Array.new } # or a = Array.new(3){ [] }

而且,是的,正如另一个答案中所述,您看到这一点是因为在初始化每个元素时都将相同的数组对象分配给它。您所做的与以下内容基本相同:

a1 = Array.new
a2 = Array.new(3, a1)

您添加值的方式没有任何问题。

【讨论】:

  • 谢谢你!现在已经 100% 清楚了。
猜你喜欢
  • 2020-08-21
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 2022-07-16
  • 1970-01-01
  • 2012-12-04
相关资源
最近更新 更多