El concepto de bloques lo hemos utilizado cuando recorremos Array, Hash, String etc.
Recordemos como imprimir un Array:
arreglo = [10, 5, 25, 4, 3] arreglo.each { |elemento| print elemento, "-" }
Y si disponemos más de una línea dentro del bloque utilizamos la sintaxis:
arreglo.each do |elemento| print elemento print "-" end
Todo lo que se encuentra entre las llaves o entre las palabras claves do y end es el bloque de código que recibe el método each.
Hasta ahora hemos desarrollado problemas haciendo uso de métodos que reciben bloques (los métodos ya están creados en las clases Array, Hash, String etc.)
A partir de este concepto veremos como crear métodos que reciban bloques.
def metodo puts "primer instrucción del método" yield puts "última instrucción del método" end metodo do puts "primer instrucción del bloque" puts "segunda instrucción del bloque" end
Para llamar a un bloque dentro de un método lo hacemos con yield.
Cuando ejecutamos el programa tenemos como resultado en pantalla:
El programa empieza en la llamada a método indicando que le pasamos un bloque con dos instrucciones:
metodo do puts "primer instrucción del bloque" puts "segunda instrucción del bloque" end
Las instrucciones del bloque no se ejecutan en la llamada sino que las recibe el método en forma similar a un parámetro sin indican nada:
def metodo puts "primer instrucción del método" yield puts "última instrucción del método" end
Lo primero que se ejecuta dentro del método es el puts:
puts "primer instrucción del método"
Ahora mediante la palabra clave yield se procede a ejecutar todas las instrucciones contenidas en el bloque, es decir:
puts "primer instrucción del bloque" puts "segunda instrucción del bloque"
Finalmente se ejecuta la última línea del método:
puts "última instrucción del método"
Vimos en el ejercicio anterior que mediante yield ejecutamos el bloque de código que recibe el método.
El bloque que se recibe se puede ejecutar muchas veces con llamadas sucesivas a yield.
Desarrollaremos un método que reciba un bloque que imprima un caracter. Luego el método debe dibujar una línea horizontal con dicho caracter.
def linea for x in 1..50 yield end end linea { print "*"}
El método línea recibe un bloque que imprime un caracter. Luego dentro del método ejecutamos dicho bloque 50 veces.
El resultado en pantalla es:
Los métodos aparte de recibir un bloque podemos pasar parámetros. Por ejemplo si queremos que el método línea reciba cuantas veces ejecutar el bloque:
def linea(cant) for x in 1..cant yield end end linea(70) { print "*"}
Como vemos llamamos al método linea que tiene un parámetro. Es importante pasar el parámetro entre paréntesis si luego le vamos a indicar además un bloque:
linea(70) { print "*"}