tutorial - ruby wikipedia
Devuelve dos y más valores de un método (4)
Aunque devolver valores múltiples a menudo es útil, generalmente me parece que es un puntero a un nuevo requisito de objeto.
Es decir, generalmente encuentro que esos valores de retorno están estrechamente vinculados 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.
¿Hay alguna posibilidad de devolver múltiples valores del método? Algo como esto:
def do()
return ["a", 10, SomeObject.new]
end
[a, b, c] = do
Ruby tiene una forma limitada de enlace desestructurado:
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 vinculación estructurada:
a = 1, 2, 3
p a # => [1, 2, 3]
Puede combinar esas dos formas de esta manera:
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 bind / structuring desestructuración. No mostré el uso del operador de 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í hay solo 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]
Usted puede lograr esto devolviendo 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
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