1

我面临着一些我不完全理解的事情。

我有一个数组,其元素是数组。

所以我有两个嵌套循环,在内部循环中我填充我的内部数组,然后在外部循环中我用内部数组填充外部数组。

arr=[]
mat=[]
for m in (0..1)
  for k in (0..1)
    arr[k]=rand.to_s
  end
  mat[m]=arr
end

最后我的矩阵充满了两个数组;每个数组都包含在最后一次迭代中计算的值。如果我希望矩阵中的第一个元素包含第一个计算数组,我必须在每个循环中重新初始化 arr 对象。所以似乎分配是通过引用进行的,直到 arr 对象被“清理”。如果我添加

mat[m]=arr
arr=[]

一切都按预期工作: mat[0] 将包含在第一个循环中计算的数组,而 mat[1] 将包含在第二个循环中计算的数组。

这是设计使然还是副作用?仅当我将数组分配为数组元素时才会发生这种情况。如果如果在循环中用简单的字符串变量填充数组,则一切都按预期进行。

我知道避免重用对象是一种很好的编程习惯,但这种行为无论如何都很奇怪。

4

3 回答 3

4

您的问题是每次迭代都会覆盖您的 arr 变量的内容:arr[k]覆盖已经存在的任何内容。arr 变量需要是块的本地变量:

mat = []
2.times do             # avoid for... use iterators instead
  row = []
  2.times do 
    row << rand.to_s
  end
  mat << row
end
于 2013-11-08T08:56:46.923 回答
0

我喜欢使用散列而不是多维数组的方法。

这个怎么样:

def creat­e_matrix x, y, conte­nt = nil, &block
  rows = (0...x­).to_a
  cols = (0...y­).to_a
  indices = rows.­product cols
  matrix = {}
  indices.ea­ch { |inde­x| matri­x[index] = ( block­_given? ? yield­( index ) : conte­nt ) }
  matrix
end

然后做:

matrix = create_matrix( 2, 2 ) { rand.to_s }

您将获得一个哈希,您可以像这样访问它:

matrix[[0, 1]] #note the double brackets
于 2013-11-08T10:00:08.050 回答
0

另一种方法:

(1..4).map{rand}.each_slice(2).to_a
于 2013-11-08T11:26:28.673 回答