在Ruby中,我知道如果我这样做:
some_objects.each(&:foo)
与
相同some_objects.each { |obj| obj.foo }
也就是说,&:foo
创建块{ |obj| obj.foo }
,将其转换为Proc,并将其传递给每个块。为什么这样做?它只是一个Ruby特例,还是有理由为什么这样做呢?
答案 0 :(得分:460)
你的问题是错的,可以这么说。这里发生的不是“&符号和冒号”,它是“&符号和对象”。在这种情况下,冒号是符号。所以,有&
,而且:foo
。
&
调用对象上的to_proc
,并将其作为块传递给方法。在Rails中,to_proc
是在Symbol
上实现的,因此这两个调用是等效的:
something {|i| i.foo }
something(&:foo)
另外,to_proc
上的Symbol
是在Ruby 1.8.7和1.9中实现的,所以它实际上是一个“红宝石”。
因此,总结一下:&
在对象上调用to_proc
并将其作为块传递给方法,Ruby在to_proc
上实现Symbol
。
答案 1 :(得分:80)
&符号和符号的组合没有什么特别之处。这是(ab)使用正则表达式的示例:
class Regexp
def to_proc
->(str) { self =~ str ; $1 }
end
end
%w(station nation information).map &/(.*)ion/
=> ["stat", "nat", "informat"]
或整数。
class Integer
def to_proc
->(arr) { arr[self] }
end
end
arr = [[*3..7],[*14..27],[*?a..?z]]
arr.map &4
=> [7, 18, "e"]
当您arr.map(&:fifth)
时,谁需要arr.map &4
?