Подтвердить что ты не робот

Другие сокращенные обозначения карт Ruby Map

Я знаю сокращение для карты, которая выглядит следующим образом:

[1, 2, 3, 4].map(&:to_s)
> ["1", "2", "3", "4"]

Мне сказали, что это сокращение для:

[1, 2, 3, 4].map{|i| i.to_s}

Это имеет смысл. Мой вопрос таков: кажется, должен быть более простой способ написать:

[1, 2, 3, 4].map{|x| f.call(x)} 

для некоторой процедуры f. Я знаю, что путь, который я только что набрал, не так уж и долгий, но я бы утвердил, что ни один из них не является предыдущим примером, для которого существует стенография. Этот пример просто кажется дополнением к первому примеру: вместо того, чтобы вызывать метод я to_s для каждого i, я хочу вызвать f для каждого x.

Существует ли такая сокращенная версия?

4b9b3361

Ответ 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 }