44 - Bloques: otras consideraciones

Si necesitamos hacer nuestro método más flexible y permitir que se lo llame a veces con bloques y otros sin bloques podemos preguntar dentro del método si llegó un bloque mediante block_given?

Programa: ejercicio164.rb

def saludar
  if block_given?
    puts yield
  else
    puts "Bienvenidos"
  end
end


saludar {"Welcome"}
saludar {"bienvenue"}
saludar

Como podemos ver llamamos al método saludar pasando en las dos primeras llamadas un bloque y en la tercer llamada no pasamos un bloque:

saludar {"Welcome"}
saludar {"bienvenue"}
saludar

El método saludar lo primero que hace mediante un if verifica si el método block_given? retorna true, en caso afirmativo mediante un puts imprime el valor devuelto por el bloque:

def saludar
  if block_given?
    puts yield
  else
    puts "Bienvenidos"
  end
end

Si no llega un bloque se ejecuta el else del if y procedemos a mostrar el saludo en castellano.

Si llamamos a yield sin que haya llegado un bloque se produce un error.

Recepción de bloques mediante parámetros.

Otra sintaxis en lugar de yield es recibir un parámetro de tipo bloque. Debemos indicarlo siempre en la última posición y con el caracter & que le anteceda.

Programa: ejercicio165.rb

def metodo &bloque
  puts "primer instrucción del método"
  bloque.call "naranjas", 23
  puts "última instrucción del método"
end


metodo do |producto, precio| 
 puts "Artículo #{producto}"
 puts "Precio #{precio}"
end

Disponemos un parámetro en la cabecera del método que le anteceda el caracter &:

def metodo &bloque

Luego llamamos al método call y pasamos los parámetros en forma similar a como lo hacíamos con yield:

  puts "primer instrucción del método"
  bloque.call "naranjas", 23
  puts "última instrucción del método"

La llamada al método y el paso del bloque no sufre variaciones:

metodo do |producto, precio| 
 puts "Artículo #{producto}"
 puts "Precio #{precio}"
end