当您在调用的最后一个参数前面加上前缀时,&
您清楚地表明您正在发送一个块而不是普通参数。好的, inmethod(&:something)
是:something
一个符号,而不是proc,所以 Ruby 会自动调用该方法to_proc
来获取一个真正的块。Rails 的人(现在还有 vanilla Ruby)巧妙地将其定义为:
class Symbol
def to_proc
proc { |obj, *args| obj.send(self, *args) }
end
end
这就是为什么你可以这样做:
>> [1, 2, 3].map(&:to_s) # instead of [1, 2, 3].map { |n| n.to_s }
=> ["1", "2", "3"]
[编辑] 注意:当你意识到这个构造不是语法糖而是 Ruby 提供的通用基础设施时,没有什么能阻止你to_proc
为其他类实现自己的。&:method
从来没有因为不允许争论而感到受限?
class Array
def to_proc
proc { |obj, *args| obj.send(*(self + args)) }
end
end
>> ["1", "F", "FF"].map(&[:to_i, 16])
=> [1, 15, 255]