étant donné le tableau suivant un
a = [1, 2, 3, 4, 5]
comment allez-vous
a.map { |num| num + 1 }
en utilisant la notation courte
a.map(&:+ 1)
ou
a.map(&:+ 2)
etc. où 1 et 2 sont les arguments
étant donné le tableau suivant un
a = [1, 2, 3, 4, 5]
comment allez-vous
a.map { |num| num + 1 }
en utilisant la notation courte
a.map(&:+ 1)
ou
a.map(&:+ 2)
etc. où 1 et 2 sont les arguments
Dans ce cas, vous pouvez faire
a.map(&1.method(:+))
Mais uniquement parce que 1 + x est généralement identique à x + 1.
Voici une discussion de cette pratique dans un contexte de performance.
Vous ne pouvez pas le faire comme ça. L'opérateur &
sert à transformer des symboles en procs.
a = [1, 2, 3, 4, 5]
puts a.map(&:to_s) # prints array of strings
puts a.map(&:to_s2) # error, no such method `to_s2`.
& est un raccourci pour to_proc
:
def to_proc
proc { |obj, *args| obj.send(self, *args) }
end
Il crée et retourne un nouveau proc. Comme vous le voyez, vous ne pouvez transmettre aucun paramètre à cette méthode. Vous pouvez uniquement appeler le proc généré.
Vous ne pouvez pas le faire avec un map
vanille. Mais regardez Facettes de Enumerable # map_send :
require 'facets'
[1, 2, 3].map_send(:+, 1)
#=> [2, 3, 4]
Écrire votre propre implémentation est assez simple:
module Enumerable
def map_send(*args)
map { |x| x.send(*args) }
end
end
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.