这个 &:last Ruby 结构叫啥? [复制]
Posted
技术标签:
【中文标题】这个 &:last Ruby 结构叫啥? [复制]【英文标题】:What is this &:last Ruby construct called? [duplicate]这个 &:last Ruby 结构叫什么? [复制] 【发布时间】:2011-01-13 18:45:38 【问题描述】:可能重复:What does map(&:name) mean in Ruby?
像survey.map(&:questions).flatten.compact
这样的东西叫什么,所以我可以找到更多关于它们的信息:)。 &:
解决了什么问题,或者它到底在做什么?是否用于其他语言?
【问题讨论】:
***.com/questions/1217088/… 【参考方案1】:这是以下的简写:
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
显然都不足以成为值得不使用的性能问题 - 事实上,它有时会加快速度!
【讨论】:
+1 Yuppers!它调用相关对象的方法。很好的例子。 它是否有一个特定的术语,它是否用于其他语言?Symbol#to_proc
是我能找到的最好的。也许更多的谷歌搜索会更好......
使用 &: 符号的执行时间要长得多
@klochner: 长于……什么?长于.map(:questions.to_proc)
?长于.map |s| s.questions
?两个都?还有什么?以上是关于这个 &:last Ruby 结构叫啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章