为什么要在 ruby 中的属性上使用一元运算符?即&:第一
作为一种习惯,我尝试并定期阅读一些别人的源代码并对其要点进行评论。现在我正在阅读 sinatra 的基本应用程序,并发现了一段有趣的代码(这是他们的 Request 类的一部分)
def accept
@env['sinatra.accept'] ||= begin
entries = @env['HTTP_ACCEPT'].to_s.split(',')
entries.map { |e| accept_entry(e) }.sort_by(&:last).map(&:first)
end
end
我不明白的部分是 &:last 和 &:first 在做什么?!?看来是疯了!
Possible Duplicate:
Ruby/Ruby on Rails ampersand colon shortcut
As a habit I try and read a little of someone elses source code regularly and comment on it in a gist. Right now I'm reading through sinatra's base app and came upon an interesting bit of code (this is part of their Request class)
def accept
@env['sinatra.accept'] ||= begin
entries = @env['HTTP_ACCEPT'].to_s.split(',')
entries.map { |e| accept_entry(e) }.sort_by(&:last).map(&:first)
end
end
The part I don't get is what is &:last and &:first doing?!? It appears as madness!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
阅读重复问题中的答案,了解
&:...
的含义和用法。在本例中,entries
是一个数组,并且链有map
、sort_by
和map
三个方法。sort_by(&:last)
相当于sort_by{|x| x.last}
。map(&:first)
与map{|x| 相同x.first}
。第一个map
不使用&:...
的原因是 (i)accept_entry
的接收者不是e
,并且 (ii) 它接受一个参数e
。Read the answers in the duplicate questions for the meaning and usage of
&:...
. In this case,entries
is an array, and there are three methodsmap
,sort_by
, andmap
chained.sort_by(&:last)
is equivalent tosort_by{|x| x.last}
.map(&:first)
is the same asmap{|x| x.first}
. The reason the firstmap
does not use&:...
is because (i) the receiver ofaccept_entry
is note
, and (ii) it takes an argumente
.