あなたの問題は、あなたの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
質問
私は完全に理解していない何かに直面しています。
要素が配列である配列があります。
したがって、2つのネストされたループがあり、内側のループに内側の配列を埋め、外側のループで外側の配列を内側の配列で埋めます。
arr=[]
mat=[]
for m in (0..1)
for k in (0..1)
arr[k]=rand.to_s
end
mat[m]=arr
end
最後に、私のマトリックスは2つの配列で満たされています。各配列には、最後の反復で計算された値が含まれます。マトリックスの最初の要素を最初の計算配列に含めるようにしたい場合は、各ループでarrオブジェクトを再現する必要があります。したがって、ARRオブジェクトが「クリーニング」されるまで、割り当ては参照によって行われるようです。追加する場合
mat[m]=arr
arr=[]
すべての動作:MAT [0]には最初のループで計算された配列が含まれ、MAT [1]には2番目のループで計算された配列が含まれます。
これは設計によるものですか、それとも望ましくない副作用ですか?これは、配列要素として配列を割り当てる場合にのみ発生しています。ループ内の単純な文字列変数を備えた配列を入力した場合、すべて予想通りになります。
オブジェクトの再利用を避けるのは良いプログラミングプラクティスであることは知っていますが、この動作はとにかく奇妙です。
解決
あなたの問題は、あなたの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