Menu
Coddy logo textTech

La palabra clave yield

Parte de la sección Lógica y flujo del Journey de Ruby de Coddy — lección 17 de 56.

Los métodos que tú mismo definas pueden aceptar un bloque, al igual que los integrados. Dentro del método, la palabra clave yield ejecuta el bloque que el llamador proporcionó.

def greet
  puts "Before block"
  yield
  puts "After block"
end

greet do
  puts "Hi from the block!"
end
# Antes del bloque
# ¡Hola desde el bloque!
# Después del bloque

Puedes pasar argumentos al bloque pasándoselos a yield:

def with_each(items)
  items.each { |item| yield item }
end

with_each([10, 20, 30]) { |n| puts n }
# 10
# 20
# 30

Si un método llama a yield pero el llamador no pasó un bloque, Ruby lanza un error. block_given? te permite verificar primero:

def maybe
  yield if block_given?
end

maybe                       # no pasa nada
maybe { puts "called!" }    # ¡llamado!
challenge icon

Desafío

Fácil

Define un método llamado repeat que recibe un argumento n (un entero) y pasa los valores 1, 2, ..., n a su bloque, uno a la vez.

Luego llama a tu método con n = 4 y un bloque que imprima "Got <value>" por cada valor cedido.

La salida es:

Got 1
Got 2
Got 3
Got 4

Hoja de referencia

Usa yield dentro de un método para ejecutar el bloque pasado por el llamador:

def greet
  yield
end

greet { puts "Hi!" } # Hi!

Pasa argumentos al bloque a través de yield:

def with_each(items)
  items.each { |item| yield item }
end

with_each([1, 2]) { |n| puts n }

Usa block_given? para verificar si se proporcionó un bloque antes de llamar a yield:

def maybe
  yield if block_given?
end

Pruébalo tú mismo

# TODO: define `repeat` que ceda 1..n a su bloque

# TODO: llama a repeat(4) con un bloque que imprima "Got <value>"
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y flujo