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 bloquePuedes 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
# 30Si 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!Desafío
FácilDefine 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 4Hoja 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?
endPrué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>"
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
1Strings en profundidad
Visión general de los métodos de StringInterpolación de StringsIterar sobre StringsSplit y JoinRepaso - String Weaver4Bloques, Procs y Lambdas
¿Qué es un bloque?do..end vs llavesLa palabra clave yieldParámetros de bloqueProcs y LambdasResumen - Iterador personalizado7Hashes Parte 2
Hash.new con valores por defectoIteración de HashesHashes anidadosFusión y transformaciónResumen - Contador de frecuencia10Proyecto - Registros de Estudiantes
Descripción general del proyectoAgregar estudiante5Potencia de Enumerable
Select y RejectEncadenando MapReduce / Injectcount, all?, any?, none?group_by y partitionsort_by, min_by, max_byResumen - Data Pipeline