Ampersand 如何将参数作为 "obj" 传递给 #to_proc? —receiving_method(&:方法)

How does Ampersand pass arguments into #to_proc as "obj"? —receiving_method(&:method)

receiver_method(&:method) 功能似乎很清楚,但我发现关于 assignment to 'obj 的解释*存在差距' 如在—

class Symbol
  def to_proc #<parameter notably absent>
    Proc.new { |obj, *args|
      obj.send (self, *args)
    }
  end
end

这如何将接收方方法的 object/passed 参数分配为 'obj'?


* What does map(&:name) mean in Ruby?

* https://www.skorks.com/2013/04/ruby-ampersand-parameter-demystified/

How does Ampersand pass arguments into #to_proc as “obj”? — receiving_method(&:method)

Ampersand 不会在任何地方传递任何东西。 Ampersand 将参数转换为 proc 实例,隐式调用 to_proc 。并将结果作为一个块传递给调用者。

让我们继续举个例子:

%w[42 foo].map(&:to_i)
#⇒ [42, 0]

这是怎么回事?

to_i 正在转换为 proc,如您在 OP

中所示
#                            ⇓⇓⇓⇓⇓
proc { |obj, *args| obj.send(:to_i, *args) }

• 我们将此 proc 传递给调用者(不失一般性,为了清楚起见,我将使用块语法编写它

%w[42 foo].map do |obj, *args|
  obj.send(:to_i, *args)
end

注意! *args 在这里越位,因为 map 将单个参数传递给块:

%w[42 foo].map do |obj|
  obj.send(:to_i)
end

那会映射:

'42' → '42'.send(:to_i) ≡ '42'.to_i → 42,
'foo' → 'foo'.send(:to_i) ≡ 'foo'.to_i → 0,

产量:

#⇒ [42, 0]