survey.map(&:questions).flatten.compact
之类的内容是什么,所以我可以找到关于它们的更多信息:)。 &:
解决了什么问题,或者它究竟做了什么?它是否用于其他语言?
答案 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是一般的巨大速度提升,那么准备被吹走。
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)
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对象。to_proc
方法明显比块快,无论你做多少次。在这种情况下,您不仅可以获得更清晰的代码,还可以提高性能。最后,无论您使用的是哪个版本,to_proc
显然都不足以让您无法使用性能问题 - 事实上,它有时可以加快速度!