En Ruby, los bloques, procs y lambdas son formas de manejar funciones anónimas y son fundamentales para la programación funcional. Este tema es crucial para entender cómo Ruby maneja el código reutilizable y la programación de alto nivel.
Bloques
¿Qué es un Bloque?
Un bloque es una porción de código que puede ser pasada a un método y ejecutada. Los bloques en Ruby se delimitan con do...end o con llaves {...}.
Sintaxis de Bloques
# Usando do...end
[1, 2, 3].each do |num|
puts num
end
# Usando llaves
[1, 2, 3].each { |num| puts num }Ejemplo Práctico
Explicación:
yieldejecuta el bloque pasado al métodogreet.block_given?verifica si se ha pasado un bloque.
Ejercicio
Escribe un método repeat que tome un número y un bloque, y ejecute el bloque ese número de veces.
Solución:
Procs
¿Qué es un Proc?
Un Proc es un objeto que encapsula un bloque de código, permitiendo almacenarlo en una variable, pasarlo como argumento y ejecutarlo en cualquier momento.
Sintaxis de Procs
Ejemplo Práctico
def call_proc(my_proc)
my_proc.call("Bob")
end
my_proc = Proc.new { |name| puts "Hello, #{name}!" }
call_proc(my_proc)Explicación:
Proc.newcrea un nuevo objetoProc.callejecuta el código encapsulado en elProc.
Ejercicio
Crea un Proc que tome un número y lo multiplique por 2, luego pásalo a un método que lo ejecute.
def execute_proc(my_proc, num)
my_proc.call(num)
end
double = Proc.new { |n| n * 2 }
puts execute_proc(double, 5)Solución:
def execute_proc(my_proc, num)
my_proc.call(num)
end
double = Proc.new { |n| n * 2 }
puts execute_proc(double, 5) # Output: 10Lambdas
¿Qué es una Lambda?
Una lambda es similar a un Proc, pero con algunas diferencias en cómo maneja los argumentos y el retorno.
Sintaxis de Lambdas
Ejemplo Práctico
def call_lambda(my_lambda)
my_lambda.call("Dave")
end
my_lambda = lambda { |name| puts "Hello, #{name}!" }
call_lambda(my_lambda)Explicación:
lambdacrea un nuevo objetoProccon comportamiento de lambda.callejecuta el código encapsulado en la lambda.
Diferencias entre Procs y Lambdas
| Característica | Proc | Lambda |
|---|---|---|
| Creación | Proc.new { ... } |
lambda { ... } o -> { ... } |
| Comportamiento de Retorno | Retorna del método que lo contiene | Retorna solo de la lambda |
| Verificación de Argumentos | No estricta | Estricta |
Ejercicio
Crea una lambda que tome dos números y los sume, luego pásala a un método que la ejecute.
def execute_lambda(my_lambda, a, b)
my_lambda.call(a, b)
end
sum = -> (x, y) { x + y }
puts execute_lambda(sum, 3, 4)Solución:
def execute_lambda(my_lambda, a, b)
my_lambda.call(a, b)
end
sum = -> (x, y) { x + y }
puts execute_lambda(sum, 3, 4) # Output: 7Conclusión
En esta sección, hemos explorado los bloques, procs y lambdas en Ruby. Estos conceptos son fundamentales para la programación funcional y permiten escribir código más flexible y reutilizable. Asegúrate de practicar con los ejemplos y ejercicios proporcionados para consolidar tu comprensión.
En el próximo tema, profundizaremos en la metaprogramación, una característica avanzada de Ruby que permite escribir código que escribe código.
Curso de Programación en Ruby
Módulo 1: Introducción a Ruby
Módulo 2: Conceptos Básicos de Ruby
Módulo 3: Trabajando con Colecciones
Módulo 4: Programación Orientada a Objetos en Ruby
- Clases y Objetos
- Variables y Métodos de Instancia
- Variables y Métodos de Clase
- Herencia
- Módulos y Mixins
Módulo 5: Conceptos Avanzados de Ruby
- Bloques, Procs y Lambdas
- Metaprogramación
- Manejo de Excepciones
- Entrada/Salida de Archivos
- Expresiones Regulares
Módulo 6: Introducción a Ruby on Rails
- ¿Qué es Ruby on Rails?
- Configuración del Entorno Rails
- Creando una Aplicación Simple en Rails
- Arquitectura MVC
- Enrutamiento
Módulo 7: Pruebas en Ruby
- Introducción a las Pruebas
- Pruebas Unitarias con Minitest
- Desarrollo Guiado por Comportamiento con RSpec
- Mocking y Stubbing
Módulo 8: Mejores Prácticas en Ruby
- Estilo de Código y Convenciones
- Refactorización
- Optimización del Rendimiento
- Mejores Prácticas de Seguridad
