2013-05-10 11 views
5

私は次のコードを実行しようとしている:Rubyの「each」メソッドは、配列内のすべての項目を反復処理しませんか?

a = [1,2,3,4] 
a.each do 
    puts "Removing #{a.last}" 
    a.pop 
end 

ではなく、すべての4つの数字は1を返し、それを示して-INGの置きa.lengthプットのようなものをやって、私は確かに最初の3を得るポップ取得のを要素「1」は依然として存在する。

このメソッドを正しく使用する必要はありますか? (私はRuby 2.0を使用しています)。

+1

あなたは実際に何を達成しようとしていますか? – Stefan

+0

私が達成しようとしていたのは、配列の各要素を出力することです。私はeBookなどでRubyを自分自身で教えようとしています。私の前にかなりの道があるように見えます。 –

答えて

5

これは、リストを変更している間にリストの要素を反復処理しているためです。

次のことを試してみてください。それは、各すべての配列要素で実行得ていないあなたには思える理由を明確にし、出力、で

a = [1,2,3,4] 
until a.empty? do 
    puts "Removing #{a.last}" 
    a.pop 
end 
+0

答えをありがとう。その場で右。 –

1

ルック。あなたはpop(ing)Array#popであるので、最後からの要素は削除されます。各ブロックに2を通過すると、その後、元の配列aが空になっているので、eachは反復:

a = [1,2,3,4] 
a.each do |i| 
    puts i 
    puts "Removing #{a.last}" 
    p a.pop 
    p "========" 
end 

出力停止します。だから、あなたは以下を使用することができます

1 
Removing 4 
4 
"========" 
2 
Removing 3 
3 
"========" 

を:

a = [1,2,3,4] 
(0...a.size).each do |i| 
p a.pop 
end 

出力:

4 
3 
2 
1 
+0

明るい回答をいただきありがとうございます。 –

0
a = [1,2,3,4] 
a.length.times do 
    puts "Removing #{a.last}" 
    a.pop 
end 
+0

ありがとうございます。 –

2

あなたのコードが動作しない理由をいくつかの他の回答が言います。

それを行うための別の方法は、この(あなたがanilまたはfalseを持っていないことを提供する)のように次のようになります。

a = [1,2,3,4] 
while e = a.pop 
    puts "Removing #{e}" 
end 
+0

ありがとうございます。 –

0

はこれを試してみてください:

a.count.times do a.pop and puts "Removing #{a.last + 1 rescue 1}" end 

は同じでを行う必要がありますdoループ

3

問題
aを反復している間に変更しています。あなたは要素を削除した後、急に含まれていa要素の数が1つ少ないので、インクルード各メソッドがオフにスローされます意味問題の

説明
。インデックス作成も中止されます。私はちょうどこの実行すると

a = [1,2,3,4] 
a.each do 
    |thing| 
    puts thing 
    a.delete(thing) 
end 

を私は[1,3]の出力を取得します。
インデックス0にあるリストから1を削除する前に、2がインデックス1にあります。 1が削除された後、2は1ではなくインデックス0になるため、2ではなくインデックス2になります反復される次の要素ですが、3!

ちなみに私はthingと同じようにローカルブロック変数を定義して、反復処理する各要素にアクセスできます。

ソリューション
あなたがコピーを作成し、その上で動作する必要が欲しいものを得るために。

a = [1,2,3,4] 
b = a.clone 
a.each do 
    |thing| 
    puts thing 
    b.delete(thing) 
end 

ここでは、繰り返しを繰り返しながらbを変更します。 このループの最後にa = [1,2,3,4]b =[]があります。
あなたがa = bと言った後、あなたは望ましい結果を得るでしょう。

もちろんの場合、これを背面からポップする要素に適用できます。コピーを処理して、反復処理中に要素を変更しないようにしてください。

+0

非常に有益な回答をいただきありがとうございます。役に立つと教訓。 –

関連する問題