2009-12-25 12 views

Respuesta

145
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 
+0

Se debe utilizar el formato de código, no formateo de texto. Sangría las líneas de cuatro espacios y la rareza causada por el prompt '>>' de irb desaparecerá. –

+2

Dado que un retorno explícito se considera Ruby no idiomático, también puede usar un retorno implícito al poner explícitamente los valores de retorno en una lista: 'def foo_and_bar; ['foo', 'bar']; fin' – Dennis

14

Mientras que devolver varios valores a menudo es útil, por lo general parece que es un puntero a un nuevo requisito objeto.

Es decir, generalmente encuentro que esos valores de retorno están estrechamente relacionados en significado/contexto y se transmiten como tales. Entonces, en estos casos, crearía un nuevo objeto para unirlos. Es un olor de código particular que he aprendido a reconocer.

+3

más libertad, más responsabilidad. Un rubí experimentado lo aprovecharía y escribiría algunos códigos hermosos. mientras que los novatos de rubíes pueden empeorar las cosas. – fengd

+0

Bueno, claramente ese no es siempre el caso, o cosas como 'chunk' no existirían. Excelente principio sin embargo. Código huele de hecho. Rock on. – Fuser97381

41

Ruby tiene una forma limitada de bind desestructuración:

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 

También tiene una forma limitada de bind estructuración:

a = 1, 2, 3 
p a # => [1, 2, 3] 

Se pueden combinar esas dos formas de este modo:

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 

Hay varias otras cosas que puede hacer con el enlace de desestructuración/estructuración. No lo vi usando el operador splat (*) en el lado derecho. No mostré anidamiento (usando parantheses). No demostré que puedes utilizar el enlace de desestructuración en la lista de parámetros de un bloque o método.

Aquí es sólo un aperitivo:

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] 
3

se puede lograr esto devuelve una matriz también, como

def sumdiff(x, y) 
    [x+y, x-y] 
end 

que parece funcionalmente equivalente a

def sumdiff(x, y) 
    return x+y, x-y 
end 
Cuestiones relacionadas