Ответ 1
К сожалению, эта сокращенная нотация (которая вызывает "Символ # to_proc" ) не имеет способа передать аргументы вызываемому методу или блоку, поэтому вы даже не можете сделать следующее:
array_of_strings.map(&:include, 'l') #=> this would fail
НО, вам повезло, потому что вам действительно не нужен этот ярлык, чтобы делать то, что вы пытаетесь сделать. Амперсанд может преобразовать Proc или Lambda в блок, и наоборот:
my_routine = Proc.new { |str| str.upcase }
%w{ one two three }.map &my_routine #=> ['ONE', 'TWO', 'THREE']
Обратите внимание на отсутствие двоеточия до my_routine
. Это связано с тем, что мы не хотим преобразовать символ :my_routine
в proc, найдя метод и вызывая .method
на нем, вместо этого мы хотим преобразовать my_routine
Proc в блок и передать его в map
.
Зная это, вы даже можете сопоставить собственный метод Ruby:
%w{ one two three }.map &method(:p)
Метод method
принимает метод p
и преобразует его в Proc, а &
преобразует его в блок, который передается в map
. В результате каждый элемент печатается. Это эквивалентно этому:
%w{ one two three }.map { |s| p s }