41 votes

Comment passez-vous un argument au raccourci ruby array.map?

é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

41voto

Andrew Grimm Points 22996

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.

34voto

Sergio Tulentsev Points 82783

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é.

25voto

tokland Points 29813

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
 

0voto

hauleth Points 8253

Si vous en avez vraiment besoin, vous pouvez utiliser la bibliothèque Ampex , mais je ne sais pas si elle est toujours maintenue.

Prograide.com

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.

Powered by:

X