這是關於此answer的後續,關於ruby 1.8.7的符號#to_proc每次調用都會生成一個新的proc。紅寶石1.8.7 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
這表明正在創造大約有一千陣列。這表明大約有一千個是空的:
c=0; ObjectSpace.each_object(Array){|e| c+=1 if e.empty? }
另一個有趣的事情是,只有一個Proc對象存在。這表明to_proc
只被調用一次。 (如果我第二次使用符號調用map
,可能會創建另一個。)
如果我更改地圖調用以使用塊,則不會創建這些數組。這也可以解釋爲什麼Andrew Grimm的緩存對基準測試沒有幫助。爲什麼創建這些數組?
UPDATE
顯然是從一個符號創建一個進程創建每次被稱爲時間空數組。
如果我更換map
線上面
pr=:to_i.to_proc; r.map(&pr)
導致創建陣列,但這種
pr=proc{|e|e.to_i}; r.map(&pr)
沒有。類似的事情發生,如果我只做pr.call(價值)。
(何時是proc不是proc?)