这是关于此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?)