初歩的な質問で申し訳ありません
ary = [Foo.new]
ary.each do |i|
if (条件)
ary.push(Foo.new)
end
end
上の様にブロックの中である条件でaryに要素が追加されます。
この場合、この追加された要素はeachで漏れなく扱えるのでしょうか?
簡単なプログラムで試した限りではpushされたFooインスタンスについてもeachで取り出せているようなのですが、自信が無いので質問致します。
# coding: windows-31J
class Foo
attr_accessor :checked
attr_reader :val
RAND_MAX = 5
def initialize
rnd = Random.new
@checked = false
@val = rnd.rand(RAND_MAX).to_i
end
end
ary = [Foo.new]
ary.each do |f|
if f.val > 0
ary.push(Foo.new)
end
f.checked = true
end
cnt_true = 0
cnt_false = 0
ary.each_index do |idx|
print "#{idx} #{ary[idx].checked} #{ary[idx].val}\n"
if ary[idx].checked
cnt_true += 1
else
cnt_false += 1
end
end
puts "checked true = #{cnt_true}"
puts "checked false = #{cnt_false}"
よろしくお願いします。
No.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に書き換えてみたところ、要素が追加された場合はプログラムが無反応になりました。仰るとおりうまく行かないようです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript javascriptで移動ボタンを押した際に遷移するボタンを追記したい 1 2022/11/29 03:02
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- Visual Basic(VBA) [Excel VBA] このコードでは行の挿入や行の消去をすると13のエラーが出てしまう。 3 2022/12/09 00:29
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Visual Basic(VBA) シート削除のマクロで「deleteメソッドは失敗しました」となります。助けてください! Sub 不要 6 2022/09/08 16:41
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) FileSearch2007に変わる構文について 1 2022/12/16 16:57
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- Visual Basic(VBA) VBA初心者です。 VBAで行単位で条件付き書式の色をカウントしたいです。 大量のデータがあるExc 3 2022/06/08 10:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ビーリアルのユーザー名を変え...
-
パソコンのスクリーンセーバー...
-
(再質問)エクセルのマクロボ...
-
英数字を含む文字列(0-9,A-Z)...
-
講義でわからないのですが以下...
-
文字コードのエラー
-
WinSCPで画像のように puttyを...
-
パイソンのクラスについて
-
教えてください
-
pythonエラー
-
Accessで文字列のバイト数読み込み
-
初心者プログラミング
-
VBScriptでExcel(2019)上のデー...
-
Ruby on railsをrails sで立ち...
-
C言語の入力した文字を反転させ...
-
エクセルvbaでチェックボックス...
-
プログラミング
-
WIN11にオフイスを複数入れるこ...
-
VBA
-
パイソンエラーについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「arg」は何の略?
-
Ruby Selenium 要素の待機
-
VBA/GetTickCountの49.7日の境...
-
pythonのプログラミング
-
Rubyでクラスファイルをディレ...
-
例外の再スロー時に、その原因...
-
get() と find() の違いについて
-
パイソンのクラス
-
No route matches [GET] "/post...
-
A1の値をファイル名に指定した...
-
エクセルVBA オートフィルタで...
-
Rubyについて質問です
-
エラー「メソッドまたはデータ...
-
VBAで型が一致しないエラー(バ...
-
教えてください。vb5.0
-
Csvファイルの最終行を取得する...
-
クラス名やモジュール名の競合...
-
HSTLやSSTL等のI/Oピン
-
10円未満を切り捨てる方法は?
-
What class are you in? には何...
おすすめ情報