Tag: ruby1.8.7

ruby 1.8.7 to_proc创建空数组

这是对这个答案的后续,关于ruby 1.8.7的Symbol#to_proc在每次调用时生成一个新的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 这表明正在创建大约一千个arrays。 这表明大约有一千个是空的: c=0; ObjectSpace.each_object(Array){|e| c+=1 if e.empty? } 另一个有趣的事情是只存在一个Proc对象。 这表明to_proc只被调用一次。 (如果我第二次用符号调用map ,可能会创建另一个。) 如果我将地图调用更改为使用块,则不会创建这些数组。 这也可以解释为什么Andrew Grimm的缓存对基准没有帮助。 为什么要创建这些数组? UPDATE 显然,从Symbol创建的proc每次调用时都会创建一个空数组。 如果我用上面的map线替换 pr=:to_i.to_proc; r.map(&pr) 导致创建数组,但这 pr=proc{|e|e.to_i}; r.map(&pr) 才不是。 如果我只是做pr.call(值),会发生类似的事情。 (什么时候proc不是proc?)