您的问题是,您的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
题
我面临着我不完全理解的事情。
我有一个数组,其元素是数组。
因此,我有两个嵌套环,在内部环中,我填充了内部阵列,然后在外圈中我用内部阵列填充外部阵列。
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 create_matrix x, y, content = nil, &block
rows = (0...x).to_a
cols = (0...y).to_a
indices = rows.product cols
matrix = {}
indices.each { |index| matrix[index] = ( block_given? ? yield( index ) : content ) }
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