Quelles sont les règles en Ruby concernant le nombre de paramètres pour les différents constructs de type fonction et comment ils sont appelés?
Par exemple, j'ai remarqué que lorsque des blocs avec plusieurs paramètres reçoivent un unique paramètre de type tableau, il est étendu, et cela ne semble pas s'appliquer aux méthodes. Je vois souvent cela avec les méthodes du module Enumerable sur un objet Hash.
{a: 5}.map{|x| x} # [[:a, 5]]
{a: 5}.map{|k, v| [k, v]} # [[:a, 5]]
[[:a, 5]].map{|x| x} # [[:a, 5]]
[[:a, 5]].map{|k, v| [k, v]} # [[:a, 5]]
proc1 = Proc.new{|x| x}
proc1.call 5 # 5
proc1.call 5, 6 # 5
proc1.call [5, 6] # [5, 6]
proc2 = Proc.new{|k, v| [k, v]}
proc2.call 5 # [5, nil]
proc2.call 5, 6 # [5, 6]
proc2.call [5, 6] # [5, 6], pas [[5, 6], nil]
def f(k, v); [k, v] end
f 5 # ArgumentError
f 5, 6 # [5, 6]
f [5, 6] # ArgumentError
def g(*vargs); vargs end
g 5 # [5]
g 5, 6 # [5, 6]
g [5, 6] # [[5, 6]]
Cependant, la documentation pour Proc.call ne semble pas mentionner cela.
Ensuite, il y a aussi les lambda qui sont légèrement différents, les méthodes en tant que Proc utilisant &:nom
, et peut-être quelques autres. Et je ne suis pas entièrement sûr que Proc.new{|x| x}.call
soit exactement la même chose que le yield
dans une méthode_qui_prend_un_bloc{|x| x}
.