将方法传递给迭代器方法时发生了什么

我们知道,wo可以通过&:前缀将方法传递给迭代器方法。
例如:

 ["a", "b"].map(&:upcase) #=> ["A", "B"] def rettwo 2 end ["a", "b"].map(&:rettwo) #=> [2, 2] 

这是问题所在,当我编写一个方法时,将一个带有&:前缀的方法传递给它,我收到一条错误消息:“ArgumentError:no receiver given”。
让我展示代码:

 def a_simple_method &proc puts proc.class # it shows `Proc` proc.call end def a_iterator_method puts yield end a_simple_method &:rettwo #=> ArgumentError: no receiver given a_iterator_method &:rettwo #=> ArgumentError: no receiver given 

我缺少什么,像Array的方法这样的map如何处理它

这是有效的。 说明如下。

 class String def rettwo self + self end end def a_simple_method &proc proc.call('a') end def a_iterator_method yield 'b' end a_simple_method(&:rettwo) # => "aa" a_iterator_method(&:rettwo) # => "bb" 

&:构造称为Symbol#to_proc 。 它将符号转换为proc。 此proc期望接收器作为第一个参数。 其余参数用于调用proc。 你没有传递任何参数,因此“接收器没有给出”错误。

以下是其他参数的演示:

 class String def say name "#{self} #{name}" end end def a_simple_method &proc proc.call('hello', 'ruby') end a_simple_method(&:say) # => "hello ruby" 

以下是来自2008年某篇博客文章中Symbol#to_proc的定义。现代符号#to_proc似乎是用C实现的,但这仍然有助于理解。

 class Symbol def to_proc Proc.new { |*args| args.shift.__send__(self, *args) } end end