【问题标题】:How does Ampersand pass arguments into #to_proc as "obj"? —receiving_method(&:method)Ampersand 如何将参数作为“obj”传递给#to_proc? ——接收方法(和:方法)
【发布时间】:2018-10-13 19:42:40
【问题描述】:

receiver_method(&:method) 功能似乎很清楚,但我发现关于 assignment to 'obj' 的解释*有一个空白,例如——

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

这如何将接收器方法的对象/传递的参数分配为“obj”?


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

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

【问题讨论】:

    标签: ruby proc


    【解决方案1】:

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

    & 不会在任何地方传递任何东西。 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]
    

    【讨论】:

    • 接收器方法*实际上调用了 proc(不是 yield-to),我猜?我首先链接的问题是“用作方法的块” *一种称为调用者的特定类型的方法?
    • 屈服于块实际上与调用 proc 相同。
    猜你喜欢
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多