2017-01-03 8 views
1

私は初期化することができることを理解Rubyで各doループを使用して配列を埋めることができないのはなぜですか?私は配列を埋めるために各doループを使用する場合はそのまま、それはアレイを残す

array = Array.new(4) 
array.each do |i| 
    i = 5 
end 

(この場合には、サイズ4のゼロ配列であろう)配列を私の希望する値でarray = Array.new(4) {desired value}を使用していますが、異なる値の間で選択している状況があり、それぞれのループがどのように正確に動作するかを理解しようとしています。

私はそれをやっている現在の方法は、あなたが必要とする私の目標値

array = Array.new(4) 
array.each_with_index do |val, i| 
    array[i] = 5 
end 
+0

代わりに、2番目のパラメータを渡して、配列を記入することもできます: 'array = Array。new(4、5) 'と同じ効果が得られます。 – DaniG2k

+0

これは、Rubyが参照渡しであると主張する人が混乱している別の例です。いいえ、そうではありません!これは値渡しです。それが参照渡しだった場合、OPのコードは機能します。私はなぜこれほど議論の余地があるのか​​分からない。 Rubyが参照渡しであると主張することで、混乱を避けることができますか? –

答えて

4

ソリューション

で配列を埋める次のとおりである:

array = Array.new(4) do |i| 
    5 
    # or some logic depending on i (the index between 0 and 3) 
end 

あなたのコード

array = Array.new(4)

配列は、4つの要素(毎回nil)を持つ配列になりました。

array.eachは、これらの4つの要素(まだnil)を反復処理し、ブロックローカル変数としてnilに等しい値を設定します(i)。

このブロック内では、iを5で上書きしますが、何もしません。次の反復の間に、inilに、そして5に戻って設定されている、というように...

あなたは元の配列を変更しない、あなただけの配列要素に等しくなるように設定されているローカル変数を変更します。

3

差が

i = 5 

が割り当てであることです。変数iに値5を割り当てます。

Rubyでは、割り当ては彼らだけが呼び出し側のスコープ内の変数を変更しない、ローカルスコープに影響を与える:

def change(i) 
    i = 5  # <- doesn't work as you might expect 
end 

x = nil 
change(x) 
x #=> nil 

変数に割り当てることによって、他のオブジェクトの配列要素を交換することは不可能です。

一方、

array[i] = 5 

は、割り当てが、偽装メソッド呼び出しはありません。それはと同等です:

array.[]=(i, 5) 

または

array.public_send(:[]=, i, 5) 

それは5にインデックスiにある要素を設定するために、配列を要求します。

関連する問題