ventajas tutorial sirve rails que para documentacion desventajas descargar ruby

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