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?
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.
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.
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