ちょっと気になったんで、実証コード書いてみた。

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


こんな感じ。
これだと、

  • :hoge => "1"
  • :hoge => "10"
  • :hoge => "100"
  • :fuga => "100"
  • :piyo => "100"

の、5回しか、検証していないっぽい。


が。
これを見ているのが、TextMateのBundleからの実行なんで...
そのBundleに不具合がある、のかも、知れないwww


で、オイラは、しょうがないから(キブン悪いけど)、valuesへの代入を、keys.eachの内側でやって、この問題を回避したんだけど。
結果、valuesへの代入を3回やることになるんで、効率悪いな、とwww


う〜ん、なんでだろう...