2012-08-23 11 views
5

Dadoparéntesis en las variables de bloque

a = [[:a, :b, :c]] 

1) Entiendo que esta

a.each{|(x, y), z| p z} # => :b 

que hay dos variables (x, y) y z, por lo que el tercer elemento :c se tira, y z partidos :b. Y entiendo esta

a.each{|(x, y), z| p y} # => nil 

que (x, y) partidos :a, y ya que no es una matriz, no existen elementos que permitan, y así y partidos nil.

Pero, ¿cómo

a.each{|(x, y), z| p x} # => :a 

trabajo? Espero que se devuelva nil.

2) ¿Por qué son los valores de retorno así?

a.each{|(x, y)| p x} #=> :a 
a.each{|(x, y)| p y} #=> :b 

les esperan a ambos vuelven nil.

Respuesta

9

Es debido a la sintaxis de asignación en paralelo.

a = [[:a, :b, :c]] 

Así a.each tiene sólo un elemento de iterar, que es [: a,: b,: c].

En primer caso:

(x, y), z = [:a, :b, :c] 
#=> x == :a, y == nil, z == :b 

Aquí (x, y) es una matriz para que coincida primer elemento: a, y x consigue, entonces z simplemente coincidir con el segundo elemento de: b.

Y en segundo caso:

(x, y) = [:a, :b, :c] 
#=> x == :a, y == :b 

Aquí (x, y) como una matriz entera coincide con el array [: a,: b,: c], por lo que x, y se obtiene: a y: b correspondientemente.

Esto es como require args + args opcionales (args de palabra clave) + args de descanso combinación coincide con argumentos proporcionados. Simplemente sea "inteligente" para tomar argumentos por secuencia.

Otro ejemplo inteligente:

(a,b) = 1,2 
=> [1, 2] # array match 
#=> a == 1, b == 2 

(a,b)=[1,2] 
=> [1, 2] # array match 
#=> a == 1, b == 2 

Por todo caso por encima de ella simplemente tomar la mejor estimación de lo que debería tomar.

+0

Bien, entonces en el primer caso, la asignación inteligente tiene lugar dos veces, y en la segunda parte de ella, (x, y) =: a da como resultado x =: a y y = nil. Entiendo. – sawa

+0

Agradable. Utilizo esto todo el tiempo sin darme cuenta de que estaba conectado con una asignación paralela. También encontré un blog que lo llama "desestructuración". – Kelvin

Cuestiones relacionadas