Как Ampersand передает аргументы в #to_proc как "obj"?-receiving_method (&: метод) - PullRequest
0 голосов
/ 13 октября 2018
Функциональность

receive_method (&: method) кажется достаточно ясной, однако я обнаружил пробел в объяснениях * о назначении для ' obj ', как в

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

Как это назначает объект / переданный аргумент метода получателя как 'obj'?


* Что означает map (&: name) в Ruby?

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

1 Ответ

0 голосов
/ 13 октября 2018

Как Ampersand передает аргументы в #to_proc как “obj”?- receiving_method(&: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

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]
...