これは、呼び出しごとに新しい proc を生成する ruby 1.8.7 の Symbol#to_proc に関するこの回答のフォローアップです。
答えが示唆する以上のことが起こっているようです。
サンプルコードは次のとおりです。
def ctob
h=Hash.new(0)
ObjectSpace.each_object(Object) {|e| h[e.class]+=1 }
h
end
r=(0...1000)
p ctob
r.map(&:to_i)
p ctob
これにより、約 1000 個のアレイが作成されていることがわかります。これにより、約 1000 個が空であることがわかります。
c=0; ObjectSpace.each_object(Array){|e| c+=1 if e.empty? }
もう 1 つの興味深い点は、Proc オブジェクトが 1 つしか存在しないことです。to_proc
これは、が一度だけ呼び出されることを示唆しています。(もう一度シンボルを呼び出すmap
と、別のシンボルが作成される可能性があります。)
ブロックを使用するようにマップ呼び出しを変更すると、これらの配列は作成されません。これは、Andrew Grimm のキャッシングがベンチマークに役立たなかった理由を説明するかもしれません。これらのアレイが作成されるのはなぜですか?
アップデート
Symbol から作成された proc は、呼び出されるたびに空の配列を作成するようです。
map
上記の行を次のように置き換えると
pr=:to_i.to_proc; r.map(&pr)
配列が作成されますが、これは
pr=proc{|e|e.to_i}; r.map(&pr)
ではない。pr.call(value) を実行すると、同様のことが起こります。
(proc が proc でないのはいつですか?)