create - ruby array find
Otra notaciĆ³n abreviada de Ruby Map (1)
Desafortunadamente, esta notación abreviada (que llama "Symbol # to_proc") no tiene una forma de pasar argumentos al método o bloque al que se llama, por lo que ni siquiera podría hacer lo siguiente:
array_of_strings.map(&:include, ''l'') #=> this would fail
PERO, está de suerte porque en realidad no necesita este atajo para hacer lo que está tratando de hacer. El signo puede convertir un Proc o Lambda en un bloque, y viceversa:
my_routine = Proc.new { |str| str.upcase }
%w{ one two three }.map &my_routine #=> [''ONE'', ''TWO'', ''THREE'']
Tenga en cuenta la falta de colon antes de my_routine
. Esto se debe a que no queremos convertir el símbolo :my_routine
en un proceso al encontrar el método y llamar a .method
en él, sino que queremos convertir el proceso my_routine
en un bloque y pasarlo al map
.
Sabiendo esto, incluso puedes mapear un método nativo de Ruby:
%w{ one two three }.map &method(:p)
El method
método tomaría el método p
y lo convertiría en un Proc, y el &
convierte en un bloque que se pasa al map
. Como resultado, cada artículo se imprime. Esto es el equivalente de esto:
%w{ one two three }.map { |s| p s }
Soy consciente de la taquigrafía para el mapa que se parece a:
[1, 2, 3, 4].map(&:to_s)
> ["1", "2", "3", "4"]
Me dijeron que esto es taquigrafía para:
[1, 2, 3, 4].map{|i| i.to_s}
Esto tiene perfecto sentido. Mi pregunta es la siguiente: parece que debería haber una forma más fácil de escribir:
[1, 2, 3, 4].map{|x| f.call(x)}
para algún procedimiento f. Sé que la forma en que acabo de escribir no es tan larga, pero diría que tampoco es el ejemplo anterior para el que existe la taquigrafía. Este ejemplo parece ser el complemento del primer ejemplo: en lugar de llamar a i''s to_s method para cada i, deseo llamar f para cada x.
¿Existe tal taquigrafía?