这是什么&:上次的Ruby构造调用?
可能重复:
在Ruby中map(&:name)是什么意思?
什么是像survey.map(&:questions).flatten.compact
调用,所以我可以find更多的信息:)。 这个&:
解决了什么问题?究竟是什么? 它在其他语言中使用吗?
这是简写:
survey.map { |s| s.questions }.flatten.compact
这是Symbol#to_proc
方法。 它曾经是Rails的ActiveSupport的一部分,但已经被添加到Ruby语法。
就性能而言,我写了一个快速的基准testing脚本,以了解1.8和1.9的性能效果。
require 'benchmark' many = 500 a = (1..10000).to_a Benchmark.bm do |x| x.report('block once') { a.map { |n| n.to_s } } x.report('to_proc once') { a.map(&:to_s) } x.report('block many') { many.times { a.map { |n| n.to_s } } } x.report('to_proc many') { many.times { a.map(&:to_s) } } end
首先,在给你结果之前 – 如果你还不确定Ruby 1.9是否是一个巨大的速度提升,那么准备被吹走。
Ruby 1.8的结果:
user system total real block once 0.020000 0.000000 0.020000 ( 0.016781) to_proc once 0.010000 0.000000 0.010000 ( 0.013881) block many 6.680000 1.100000 7.780000 ( 7.780532) to_proc many 7.370000 0.540000 7.910000 ( 7.902935)
Ruby 1.9的结果:
user system total real block once 0.010000 0.000000 0.010000 ( 0.011433) to_proc once 0.000000 0.000000 0.000000 ( 0.004929) block many 4.060000 0.000000 4.060000 ( 4.057013) to_proc many 2.810000 0.000000 2.810000 ( 2.810312)
首先:哇。 Ruby 1.9很快。 但是我们在这里画的更有意义的结论是有趣的:
- 在这两种情况下,只有一次运行,
to_proc
显然更快。 在1.8的多次运行,它慢了一点。 这似乎表明,唯一真正的性能瓶颈是创build所有这些Proc对象。 - 然而,在Ruby 1.9中,
to_proc
方法显然比块要快得多,不pipe你做了多less次。 在这种情况下,您不仅可以获得更简洁的代码,还可以提高性能。
最后,无论使用哪个版本, to_proc
显然都不足以胜任不值得使用的性能问题 – 事实上,它有时可以加快速度!