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

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

因此,我有两个嵌套环,在内部环中,我填充了内部阵列,然后在外圈中我用内部阵列填充外部阵列。

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]将包含在第二个循环中计算的数组。

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

我知道,避免重复使用对象是一个很好的编程实践,但是无论如何,这种行为是奇怪的。

有帮助吗?

解决方案

您的问题是,您的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

其他提示

我喜欢 使用哈希代替多维阵列.

这个怎么样:

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

另一种方法:

(1..4).map{rand}.each_slice(2).to_a
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top