可能的重复: map(&:name)在Ruby中是什么意思?

在Ruby中,我知道如果我这样做:

some_objects.each(&:foo)

这和

some_objects.each { |obj| obj.foo }

也就是说,&:foo创建块{|obj| obj。foo},将其转换为Proc,并将其传递给每个Proc。为什么会这样?这只是Ruby的特殊情况,还是有原因为什么这样工作?


当前回答

可以说,你的问题是错的。这里发生的不是“&和冒号”,而是“&和对象”。在这种情况下,冒号是符号。这里有&和:foo。

&调用对象上的to_proc,并将其作为块传递给方法。在Ruby中,to_proc是在Symbol上实现的,所以这两个调用是等价的:

something {|i| i.foo }
something(&:foo)

所以,总结一下:&在对象上调用to_proc并将其作为块传递给方法,Ruby在Symbol上实现to_proc。

其他回答

符号和符号的组合并没有什么特别之处。下面是(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(&:fifth)呢?地图和4 ?

可以说,你的问题是错的。这里发生的不是“&和冒号”,而是“&和对象”。在这种情况下,冒号是符号。这里有&和:foo。

&调用对象上的to_proc,并将其作为块传递给方法。在Ruby中,to_proc是在Symbol上实现的,所以这两个调用是等价的:

something {|i| i.foo }
something(&:foo)

所以,总结一下:&在对象上调用to_proc并将其作为块传递给方法,Ruby在Symbol上实现to_proc。