0

質問は少し曖昧ですが、なぜこれが起こるのかよくわかりません:

次のコードがあります。

p user.room.users.length
user.room.users.each {|usr| puts "b" }
user.room.users.each {|usr| puts "a"; usr.enter(Room[Config::entrance]) }

出力:

5
b
b
b
b
b
a
a
a

また、 User#enter が呼び出された回数をカウントするようにすると、 が返されます3! 私はこの行動に完全に困惑しています。User#enter 内のコードが原因であるとは思えませんが、誰かが関連性があると思われる場合は、提供できます (質問を不必要に混乱させたくありません)。


編集

関連する場合は、使用していますruby-1.9.3-p125

4

2 に答える 2

7

この種の動作は、反復処理中にコレクションを変更したときによく発生します。したがって、usr.enter変更するuser.room.userと、表示されている動作が説明されます。

于 2012-07-01T21:11:37.200 に答える
2

@ sepp2k が言ったように、usr.enterおそらくuser.room.users. ソースを見たことはありませんがArray#each、現在の要素の内部インデックスを維持し、各反復後にそのインデックスをインクリメントすることで機能するようです (実際、それ機能する唯一の合理的な方法です)。

で開始し[1,2,3]、 の最初の反復で#each最初の要素を削除するとします。2 回目の反復では、配列の 2 番目の要素が得られますが、配列は[2,3]であるため、2 番目の要素は3です。したがって、要素が欠落します。

于 2012-07-01T21:58:24.730 に答える