117 votes

Deux et plus de valeurs de retour d’une méthode

Est-il possible de retourner des valeurs multiples de la méthode ? Quelque chose comme ceci :

169voto

adi92 Points 4589
def sumdiff(x, y)
  return x+y, x-y
end
#=> nil

sumdiff(3, 4)
#=> [7, -1]

a = sumdiff(3,4)
#=> [7, -1]
a
#=> [7, -1]

a,b=sumdiff(3,4)
#=> [7, -1]
a
#=> 7
b
#=> -1

a,b,c=sumdiff(3,4)
#=> [7, -1]
a
#=> 7
b
#=> -1
c
#=> nil

45voto

Jörg W Mittag Points 153275

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]

17voto

Brian Agnew Points 143181

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.

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