Est-il possible de retourner des valeurs multiples de la méthode ? Quelque chose comme ceci :
Réponses
Trop de publicités?Ruby a une forme limitée de déstructuration bind:
ary = [1, 2, 3, 4]
a, b, c = ary
p a # => 1
p b # => 2
p c # => 3
a, b, *c = ary
p c # => [3, 4]
a, b, c, d, e = ary
p d # => 4
p e # => nil
Il dispose également d'une forme limitée de la structuration de bind:
a = 1, 2, 3
p a # => [1, 2, 3]
Vous pouvez combiner ces deux formes comme:
a, b = b, a # Nice way to swap two variables
a, b = 1, 2, 3
p b # => 2
def foo; return 1, 2 end
a, b = foo
p a # => 1
p b # => 2
Il y a plusieurs autres choses que vous pouvez faire avec déstructuration / structuration de se lier. Je ne peux pas montrer à l'aide de la splat opérateur (*
) sur le côté droit. Je ne peux pas montrer de nidification (à l'aide de parenthèse). Je n'ai pas de montrer que vous pouvez utiliser déstructuration lier dans la liste des paramètres d'un bloc ou de la méthode.
Voici qu'une mise en bouche:
def foo(((a, b, c, d), e, *f), g, *h)
local_variables.sort.each do |lvar| puts "#{lvar} => #{eval(lvar).inspect}" end
end
foo([[1, 2, 3], 4, 5, 6], 7, 8, 9)
# a => 1
# b => 2
# c => 3
# d => nil
# e => 4
# f => [5, 6]
# g => 7
# h => [8, 9]
Bien qu'il soit souvent utile de renvoyer plusieurs valeurs, je trouve généralement que c'est un pointeur sur une nouvelle exigence d'objet.
C'est-à-dire que je trouve généralement que ces valeurs de retour sont étroitement liées dans le sens / contexte et sont transmises comme telles. Donc, dans ces cas, je créerais un nouvel objet pour les lier ensemble. C'est une odeur de code particulière que j'ai appris à reconnaître.