41 - Bloques: definición

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.

Recepción y ejecución de un bloque dentro de un método

Programa: ejercicio158.rb

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:

bloques en Ruby

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"

Múltiples llamas a un bloque dentro de un 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.

Programa: ejercicio159.rb

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:

bloques en Ruby

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 "*"}