【问题标题】:Ruby: For a 2D array,why are nested while loops overwriting elements defined previously? [duplicate]Ruby:对于 2D 数组,为什么嵌套的 while 循环会覆盖之前定义的元素? [复制]
【发布时间】:2018-06-11 20:11:36
【问题描述】:

上下文:我尝试使用 while 循环填充 2D 数组,之后我想尝试使用 {} 块格式。关键是要了解这两种语法结构如何做同样的事情。

在过去的一个小时里,我一直在查看这段代码并在互联网上搜索,我认为我根本没有得到任何东西,但我不明白那是什么。

结果应该是

=> [["A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8"]
=> ..(Sequentially)..
=>["H1", "H2", "H3", "H4", "H5", "H6", "H7", "H8"]]

代码如下:

char= ('A'..'H').to_a
num= (1..8).to_a
arr=Array.new(8,Array.new(8))

x=0
while x <8
  y=0
    while y < 8
    arr[x][y] = char[x] + num[y].to_s 
    y+=1
    end
  x+=1
end
arr

提前感谢您,感谢您的耐心和时间。

                                    ####Edit####

造成混淆的原因是对参考概念缺乏理解。引用允许我们通过使用 Array.new(n,Array.new(n)) 方法方案来访问嵌套数组的值,这些嵌套数组通过其父数组共享对其数据的引用。这个问题在这里直接解决:Creating matrix with `Array.new(n, Array.new)`。虽然我认为这是我的 while 循环的问题,但问题确实是我如何创建矩阵。

【问题讨论】:

  • 执行摘要:你几乎永远不会说Array.new(8, Array.new(8)),因为你最终会共享引用,你几乎总是想要Array.new(8) { Array.new(8) },以便内部数组是不同的数组。

标签: ruby multidimensional-array while-loop


【解决方案1】:

由于调用引用,您的代码无法正常工作。 Ruby is pass-by-value, but all the values are references.https://stackoverflow.com/a/1872159/3759158 看看输出

2.4.3 :087 > arr = Array.new(8,Array.new(8))
 => [[nil, nil, nil, nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil, nil, nil, nil]] 
2.4.3 :088 > arr[0][0] = 'B'
 => "B" 
2.4.3 :089 > arr
 => [["B", nil, nil, nil, nil, nil, nil, nil], ["B", nil, nil, nil, nil, nil, nil, nil], ["B", nil, nil, nil, nil, nil, nil, nil], ["B", nil, nil, nil, nil, nil, nil, nil], ["B", nil, nil, nil, nil, nil, nil, nil], ["B", nil, nil, nil, nil, nil, nil, nil], ["B", nil, nil, nil, nil, nil, nil, nil], ["B", nil, nil, nil, nil, nil, nil, nil]] 

这是由于数组对象上的对象调用而发生的,您可以通过一个简单的示例看到这一点

a = []
b = a
b << 10
puts a => [10]

你的代码也发生了同样的事情。

而不是尝试这个:

('A'..'H').map{|alph| (1..8).map{|num| "#{alph}#{num}"}}

【讨论】:

  • 哇,谢谢,这很有见地!我必须在电话中阅读以供参考,我相信这是我学习编程时要掌握的一个非常关键的概念。再次感谢您的帮助。
  • ('A'..'H').map { |l| ("#{l}1".."#{l}8").to_a }
  • @SagarPandya 同意这也可以。谢谢
猜你喜欢
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 2017-09-15
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
相关资源
最近更新 更多