Comment passer une fonction au lieu d’un bloc

Duplication possible:
Moyen plus court de transmettre chaque élément d’un tableau à une fonction

Je sais que ça va marcher:

def inc(a) a+1 end [1,2,3].map{|a| inc a} 

mais en Python, j’ai juste besoin d’écrire:

 map(inc, [1,2,3]) 

ou

 [inc(x) for x in [1,2,3]) 

Je me demandais si je pouvais sauter les étapes pour faire un bloc dans Ruby et je l’ai fait:

 [1,2,3].map inc # => ArgumentError: wrong number of arguments (0 for 1) # from (irb):19:in `inc' 

Quelqu’un a-t-il des idées sur la façon de procéder?

Selon ” Méthodes de passage comme les blocs dans Ruby “, vous pouvez passer une méthode comme un bloc comme ceci:

 p [1,2,3].map(&method(:inc)) 

Je ne sais pas si c’est beaucoup mieux que de rouler votre propre bloc, honnêtement.

Si votre méthode est définie sur la classe des objects que vous utilisez, vous pouvez le faire:

 # Adding inc to the Integer class in order to relate to the original post. class Integer def inc self + 1 end end p [1,2,3].map(&:inc) 

Dans ce cas, Ruby interprétera le symbole comme un nom de méthode d’instance et tentera d’appeler la méthode sur cet object.


La raison pour laquelle vous pouvez transmettre un nom de fonction en tant qu’object de première classe en Python, mais pas en Ruby, est que Ruby vous permet d’appeler une méthode avec zéro argument sans parenthèses. La grammaire de Python, car elle nécessite les parenthèses, empêche toute ambiguïté possible entre le passage d’un nom de fonction et l’appel d’une fonction sans arguments.

Ne répond pas à votre question mais si vous voulez vraiment incrémenter toutes vos variables, vous avez Integer#next

 4.next #=> 5 [1,2,3].map(&:next) #=> [2, 3, 4] 
 def inc(a) a + 1 end p [1,2,3].map{|a| inc a}