6 nov. 2018

Teoría - Los bloques

Los bloques

Un bloque es una porción de código encerrada entre paréntesis {} o entre do…end. Es una forma de agrupar instrucciones, y solo puede aparecer después de usar un método: el bloque empieza en la misma línea que usa el método. El código dentro del bloque no es ejectuado en el instante que el intérprete de Ruby lo encuentra: Ruby recordará del bloque (variables locales, …) y después entra en el método, ejecutando el bloque cuando es preciso.
Supongamos que existen dos métodos llamados greet1 y greet2:
#greet1, no necesita argumentos
greet1 {puts 'Hola'}
 
#greet2, necesita un argumento
greet2 ("argumento_cualquiera") {puts 'Hola'}
Lo usual es usar las llaves para bloques de una línea y el do…end para más de una línea.

yield

Un método puede usar el bloque mediante la palabra yield:
def metodo
  puts 'Comienzo del metodo'
  yield
  yield
  puts 'Final del metodo'
end
 
metodo{puts 'Dentro del bloque'}
La salida es:
'Comienzo del metodo'
'Dentro del bloque'     # primer yield
'Dentro del bloque'     # segundo yield
'Final del metodo'
Lo que sucede es que en el momento que el intérprete llega al yield, se ejecuta el código dentro del bloque, y luego se retorna al método.

Argumentos en los bloques

En los bloques se pueden usar argumentos especificándolos dentro de dos barras verticales | |. Y si se usan, en el yield no podemos olvidar darles valor:
def metodo
  yield('hola', 99)
end
 
metodo{|str,num| puts str + ' ' + num.to_s}  #hola 99
Un bloque de código devuelve un valor: el valor de la última expresión evaluada. Y este valor devuelto por yield,