Ruby&符号冒号快捷键
可能重复:
在Ruby中map(&:name)是什么意思?
在Ruby中,我知道如果我这样做:
some_objects.each(&:foo)
这是一样的
some_objects.each { |obj| obj.foo }
也就是说, &:foo
创build块{ |obj| obj.foo }
{ |obj| obj.foo }
,把它变成一个Proc,并传递给每个。 为什么这个工作? 这只是一个Ruby的特例,还是有原因为什么这样工作?
你的问题是错的,可以这么说。 这里发生的事情不是“和号和冒号”,而是“和号和对象”。 这种情况下的冒号是符号。 所以,这里有&
:foo
。
&
在对象上调用to_proc
,并将其作为块传递给方法。 在Rails中, to_proc
在Symbol
上实现,所以这两个调用是等价的:
something {|i| i.foo } something(&:foo)
另外,在Ruby 1.8.7和1.9中实现了Symbol
to_proc
,所以它实际上是一个“ruby的东西”。
因此,总结一下:在对象上调用to_proc
并将其作为块传递给方法,Ruby在Symbol
上实现to_proc
。
&符号和符号的组合没有什么特别之处。 下面是一个例子,(ab)使用正则expression式:
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 &4
时,谁需要arr.map(&:fifth)
arr.map &4
?