Procs y Lambdas
Parte de la sección Lógica y flujo del Journey de Ruby de Coddy. Lección 19 de 56.
Un bloque no es un objeto, no puedes guardarlo en una variable. Cuando quieres un fragmento de código que puedas pasar, guardar y llamar más tarde, lo envuelves en un Proc o un lambda.
Un Proc se crea con Proc.new o la palabra clave proc. Lllámalo con .call:
double = proc { |n| n * 2 }
puts double.call(5) # 10
puts double.call(7) # 14Un lambda es similar pero más estricto, comprueba que pases el número correcto de argumentos. La forma de flecha -> es la sintaxis común:
square = ->(n) { n * n }
puts square.call(4) # 16
puts square.(4) # 16 (abreviatura de .call)Ambos se pueden pasar a un método que espera un bloque anteponiendo &:
[1, 2, 3].map(&double) # [2, 4, 6]
[1, 2, 3].map(&square) # [1, 4, 9]Usa una lambda cuando quieras una comprobación de argumentos más estricta; usa un Proc cuando quieras un comportamiento más ligero y permisivo.
Desafío
FácilCrea una lambda llamada tripler que tome un número y lo devuelva multiplicado por 3.
Después lee una lista de enteros separados por comas e imprime, en líneas separadas:
- El resultado de llamar a
tripler.call(10) - Los números de entrada triplicados (usa
map(&tripler)) y unidos con,
Para la entrada 1,2,3, la salida es:
30
3, 6, 9Pruébalo tú mismo
# TODO: define `tripler` como una lambda
numbers = gets.chomp.split(",").map(&:to_i)
# TODO: línea 1, imprime tripler.call(10)
# TODO: línea 2, mapea numbers con &tripler, únelos con ", "
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 PipelinePractica por tu cuenta: Compilador de Ruby online