【问题标题】:Changing one array in an array of arrays changes them all; why?更改数组数组中的一个数组会全部更改;为什么?
【发布时间】:2012-03-23 06:31:02
【问题描述】:
a = Array.new(3,[])
a[1][0] = 5
a => [[5], [5], [5]]

我认为这没有意义! 不应该是 => [[], [5], []] 或者这是 Ruby 的一种特性?

【问题讨论】:

标签: ruby arrays


【解决方案1】:

改用这个:

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

在您的代码中,每个条目的值都使用相同的对象;一旦您改变了其中一个引用,您就会看到所有其他引用都发生了变化。使用上述方法,您可以在每次需要新值时调用该块,每次返回一个新数组。


这本质上类似于新用户提出的关于为什么以下内容无法按预期工作的问题:

str.gsub /(<([a-z]+)>/, "-->#{$1}<--"

在上面,字符串插值发生在gsub 方法被调用之前,所以它不能在你的字符串中使用$1 的当前值。同样,在您的问题中,您创建一个对象并将其传递给Array.new before Ruby 开始创建数组槽。是的,默认情况下,运行时可以在项目上调用dup……但这可能会造成灾难性的后果并且速度很慢。因此,您可以通过块形式自行确定如何创建初始值。

【讨论】:

  • 轻微的挑剔:“一旦你改变了其中一个实例,你就改变了它们”——实际上,只有 一个 实例,这正是问题所在!
猜你喜欢
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 2012-04-30
  • 2014-03-06
  • 1970-01-01
  • 2020-10-04
  • 2017-06-15
  • 1970-01-01
相关资源
最近更新 更多