这是一个后续这个答案 ,对于红宝石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
与符号第二次。)
如果我改变地图调用使用块,不创建这些阵列。 这也可以解释为什么安德鲁·格林缓存没有帮助的基准。 为什么要创建这些阵列?
UPDATE
显然,从符号创建一个进程创建每次被称为时间空数组。
如果我更换了map
线以上
pr=:to_i.to_proc; r.map(&pr)
导致创建阵列,但这种
pr=proc{|e|e.to_i}; r.map(&pr)
才不是。 类似的事情发生,如果只是我pr.call(值)。
(当一个进程不是PROC?)