Un bloque puede recibir datos desde el método. Los argumentos se indican entre los caracteres | |, si son más de uno se separan por coma.
Ya utilizamos la sintaxis de argumentos cuando trabajamos con las clases Array, Hash etc.:
arreglo.each do |elemento| print elemento print "-" end
El argumento se llama elemento y recibe en cada ejecución del bloque un valor del Array.
Veremos ahora como podemos implementar métodos que reciban bloques y le pasen a los mismos argumentos.
def metodo
puts "primer instrucción del método"
yield "naranjas", 23
puts "última instrucción del método"
end
metodo do |producto, precio|
puts "Artículo #{producto}"
puts "Precio #{precio}"
end
El resultado de ejecutar este programa es:

El bloque tiene dos argumentos que llamamos producto y precio, solo dentro del bloque se tiene acceso a los valores de los argumentos:
metodo do |producto, precio|
puts "Artículo #{producto}"
puts "Precio #{precio}"
end
Desde el método enviamos los valores a los argumentos luego de yield:
yield "naranjas", 23
Desarrollar una clase que almacene las notas de 5 alumnos.
Plantear un método que mediante un bloque reciba como argumento las notas de alumnos que tienen una nota mayor o igual a 7, imprimir dichas notas y su promedio.
class NotasAlumnos
def initialize
@notas = [9, 7, 2, 5, 10]
end
def promocionados
@notas.each do |nota|
if nota >= 7
yield nota
end
end
end
end
notas_alumno = NotasAlumnos.new()
suma = 0
cant = 0
notas_alumno.promocionados do |nota|
puts "Nota del alumno: #{nota}"
suma = suma + nota
cant = cant + 1
end
promedio = suma / cant
puts "Promedio de notas de alumnos promocionados:#{promedio}"
Hemos planteado una clase donde en el método initialize definimos un atributo de tipo Array donde almacenamos las 5 notas de los alumnos:
class NotasAlumnos
def initialize
@notas = [9, 7, 2, 5, 10]
end
El método promocionados debe iterar el Array @notas y cada vez que el valor sea mayor o igual a 7 procedemos a llamar a yield y pasar como parámetro la nota:
def promocionados
@notas.each do |nota|
if nota >= 7
yield nota
end
end
end
Creamos un objeto de la clase NotasAlumnos e inicializamos un acumulador y un contador:
notas_alumno = NotasAlumnos.new() suma = 0 cant = 0
Llamamos seguidamente al método promocionados y le pasamos como bloque la impresión de la nota (como sabemos solo se imprimirá si es mayor o igual a 7)
También dentro del bloque sumamos la nota y la contamos:
notas_alumno.promocionados do |nota|
puts "Nota del alumno: #{nota}"
suma = suma + nota
cant = cant + 1
end
En un bloque podemos acceder a variables definidas previamente como son suma y cant.
Finalmente cuando sale del método promocionados procedemos a calcular el promedio y mostrarlo:
promedio = suma / cant
puts "Promedio de notas de alumnos promocionados:#{promedio}"
ejercicio162.rb
def tabla(nro)
for x in 1..10
ta = x * nro
yield x, ta
end
end
tabla(10) { |valor, ta| puts "10 * #{valor} = #{ta}" }