ちょっと気になったんで、実証コード書いてみた。
「ruby 1.8.6のeachの挙動が判らない...」のエントリーで書いていたことが、どうも、違うクサいんで、ちゃんと実証コード書いてみた。
内側のイテレーション(fuga)が回り終わった時点で、fugaのループ・カウンタ(ポインタ?)は、リセットされているのが、然るべきだと思うのですよ >> なかださん
で、実験コード。
#!/opt/local/bin/ruby hoges = [0, 3, 6] fugas = [1, 2, 3] hoges.each do |hoge| fugas.each do |fuga| p hoge + fuga end end
で、実行結果。
#=> 1 #=> 2 #=> 3 #=> 4 #=> 5 #=> 6 #=> 7 #=> 8 #=> 9
う〜ん、ちゃんと9回まわってるな...
じゃあ、specで書いていたコード(ちょっと改変してます)。
describe "blah " do keys = [:hoge, :fuga, :piyo] values = ["1", "10", "100"] keys.each do |key| describe "in #{key}" do values.each do |value| it "'#{value}'" do lambda do product = create_product(key => value) product.errors.on(key).should be_nil end.should change(Product, :count).by(1) end end end end protected def create_product(options = {}) product = Product.new({ :hoge => "aaa", :fuga => "bbb", :piyo => "ccc" }.merge(options)) product.save if product.valid? product end end
こんな感じ。
これだと、
の、5回しか、検証していないっぽい。
が。
これを見ているのが、TextMateのBundleからの実行なんで...
そのBundleに不具合がある、のかも、知れないwww
で、オイラは、しょうがないから(キブン悪いけど)、valuesへの代入を、keys.eachの内側でやって、この問題を回避したんだけど。
結果、valuesへの代入を3回やることになるんで、効率悪いな、とwww
う〜ん、なんでだろう...