- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Array#eachのブロック中で要素追加)
Array#eachで要素追加
このQ&Aのポイント
- 質問:Array#eachのブロック中で条件によって要素が追加される場合、追加された要素もeachで取り出せるか?
- プログラムの結果を確認すると、pushされた要素もeachで取り出せることが示されている。
- したがって、ブロックの中で要素を追加してもeachは追加された要素を漏れなく処理する。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
Array#eachではイテレート毎に要素数のチェックをしてるので、後ろに足していく pushなら問題ないみたいです。イテレート中のpopも大丈夫です。 でも、Arrayの先頭を操作する、shiftやunshiftでは内部ループカウンタとインデックスが ずれるのでダメですね。 一応CRubyの実装をコピペしときます。 array.c: VALUE rb_ary_each(VALUE ary) { long i; RETURN_ENUMERATOR(ary, 0, 0); for (i=0; i<RARRAY_LEN(ary); i++) { // ←イテレート毎に長さのチェック rb_yield(RARRAY_PTR(ary)[i]); } return ary; }
お礼
ご回答ありがとうございました。 rubyのソースまでご確認いただいて恐縮です。 とりあえずpushしか使用しないので、問題ないと伺って安心しました。もしダメだったら全ての要素がチェックされたかの確認のためのループを置かないといけないかな、と思っていたのですが必要ないですね。 ちなみに試しに上のテストプログラムのpushをunshiftに書き換えてみたところ、要素が追加された場合はプログラムが無反応になりました。仰るとおりうまく行かないようです。