質問

私は完全に理解していない何かに直面しています。

要素が配列である配列があります。

したがって、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 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