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

Lan*_*ard 9 ruby collections

可能重复:
map(&:name)在Ruby中意味着什么?

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

Mat*_*chu 18

这是以下的简写:

survey.map { |s| s.questions }.flatten.compact
Run Code Online (Sandbox Code Playgroud)

这是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
Run Code Online (Sandbox Code Playgroud)

首先,在给你结果之前 - 如果你还不确定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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

首先:哇.Ruby 1.9很快.但是我们在这里得出的更相关的结论很有趣:

  • 在这两种情况下,只有一次运行,to_proc显然更快.在多次运行的1.8中,它的速度稍慢.这似乎表明唯一真正的性能瓶颈是创建所有这些Proc对象.
  • 然而,在Ruby 1.9中,to_proc无论你执行多少次,该方法显然比块快得多.在这种情况下,您不仅可以获得更清晰的代码,还可以提高性能.

最后,无论你使用哪个版本,to_proc显然还不足以让性能问题不值得使用 - 事实上,它有时会加快速度!

  • @klochner:比...更长什么?比`.map(:questions.to_proc)更长?比`.map {| s |更长 s.questions}`?都?别的什么? (3认同)