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