什么是这个&:最后一个Ruby构造叫做?

时间:2010-02-06 02:28:15

标签: ruby collections

  

可能重复:
  What does map(&:name) mean in Ruby?

survey.map(&:questions).flatten.compact之类的内容是什么,所以我可以找到关于它们的更多信息:)。 &:解决了什么问题,或者它究竟做了什么?它是否用于其他语言?

1 个答案:

答案 0 :(得分:18)

这是:

的简写
survey.map { |s| s.questions }.flatten.compact

这是Symbol#to_proc方法。它曾经是Rails的ActiveSupport的一部分,但后来被添加到Ruby语法中。

就性能而言,我写了一个快速的基准测试脚本,以了解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中,它的速度稍慢。这似乎表明唯一真正的性能瓶颈是创建所有这些Proc对象。
  • 然而,在Ruby 1.9中,to_proc方法明显比块快,无论你做多少次。在这种情况下,您不仅可以获得更清晰的代码,还可以提高性能。

最后,无论您使用的是哪个版本,to_proc显然都不足以让您无法使用性能问题 - 事实上,它有时可以加快速度!

相关问题