“&”号如何将参数作为“ obj”传递给#to_proc? —rec​​eiving_method(&:method)

时间:2018-10-13 08:01:04

标签: ruby proc

receiver_method(&:method)功能似乎足够清楚,但是我在关于分配给' 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/

1 个答案:

答案 0 :(得分:1)

  

“&”号如何将参数作为#to_proc传递给“obj”? — receiving_method(&:method)

Ampersand不会在任何地方传递任何东西。 “&”号将自变量转换为proc实例,并在其上隐式调用to_proc。并将结果作为一个块传递给调用者。

让我们坚持这个例子:

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

这是怎么回事?

•如您在OP中所示,to_i被转换为proc

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

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

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

NB! *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]