这是什么&:上次的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显然都不足以胜任不值得使用的性能问题 – 事实上,它有时可以加快速度!