Как 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]