En aquest tema, explorarem tres conceptes fonamentals en Ruby que permeten treballar amb codi com si fos dades: blocs, procs i lambdas. Aquests conceptes són essencials per escriure codi més flexible i reutilitzable.
Blocs
Què és un Bloc?
Un bloc és una porció de codi que es pot passar a un mètode com a argument. Els blocs no són objectes, però es poden convertir en objectes de tipus Proc
. Els blocs es defineixen utilitzant {}
per a blocs d'una sola línia o do...end
per a blocs de múltiples línies.
Sintaxi dels Blocs
# Bloc d'una sola línia [1, 2, 3].each { |num| puts num } # Bloc de múltiples línies [1, 2, 3].each do |num| puts num end
Exemple Pràctic
Explicació:
- El mètode
saluda
imprimeix "Hola!". - Si es passa un bloc,
yield
executa el bloc. - Finalment, imprimeix "Adéu!".
Exercici
Escriu un mètode repetir
que accepti un número i un bloc, i executi el bloc tantes vegades com indiqui el número.
Procs
Què és un Proc?
Un Proc
és un objecte que encapsula un bloc de codi, permetent guardar-lo en una variable, passar-lo com a argument o retornar-lo des d'un mètode.
Creació de Procs
Exemple Pràctic
def executa_proc(proc) proc.call end proc = Proc.new { puts "Aquest és un Proc!" } executa_proc(proc)
Explicació:
- El mètode
executa_proc
accepta unProc
com a argument i l'executa ambcall
.
Exercici
Crea un Proc
que multipliqui un número per 2 i utilitza'l en un mètode.
multiplica_per_dos = Proc.new { |x| x * 2 } def aplica_proc(proc, valor) proc.call(valor) end puts aplica_proc(multiplica_per_dos, 5) # Ha de retornar 10
Lambdas
Què és una Lambda?
Una lambda
és similar a un Proc
, però amb algunes diferències clau en el comportament, especialment en la manera com maneja els arguments i el retorn.
Creació de Lambdas
Exemple Pràctic
def executa_lambda(lambda) lambda.call end lambda = -> { puts "Aquest és una Lambda!" } executa_lambda(lambda)
Explicació:
- El mètode
executa_lambda
accepta unalambda
com a argument i l'executa ambcall
.
Diferències entre Procs i Lambdas
Característica | Proc | Lambda |
---|---|---|
Creació | Proc.new {} |
-> {} o lambda {} |
Arguments | No verifica el nombre d'arguments | Verifica el nombre d'arguments |
Retorn | Retorna del mètode que l'envolta | Retorna només de la lambda |
Exercici
Crea una lambda
que sumi dos números i utilitza-la en un mètode.
suma = ->(a, b) { a + b } def aplica_lambda(lambda, a, b) lambda.call(a, b) end puts aplica_lambda(suma, 3, 4) # Ha de retornar 7
Resum
En aquesta secció, hem après sobre blocs, procs i lambdas en Ruby. Hem vist com es defineixen i utilitzen, i hem explorat les diferències entre procs i lambdas. Aquests conceptes són fonamentals per escriure codi més flexible i modular en Ruby. En la següent secció, ens endinsarem en la metaprogramació, un altre aspecte avançat de Ruby.
Curs de Programació en Ruby
Mòdul 1: Introducció a Ruby
Mòdul 2: Conceptes Bàsics de Ruby
Mòdul 3: Treballant amb Col·leccions
Mòdul 4: Programació Orientada a Objectes en Ruby
- Classes i Objectes
- Variables i Mètodes d'Instància
- Variables i Mètodes de Classe
- Herència
- Mòduls i Mixins
Mòdul 5: Conceptes Avançats de Ruby
- Blocs, Procs i Lambdas
- Metaprogramació
- Gestió d'Excepcions
- Entrada/Sortida de Fitxers
- Expressions Regulars
Mòdul 6: Introducció a Ruby on Rails
- Què és Ruby on Rails?
- Configuració de l'Entorn Rails
- Creació d'una Aplicació Simple en Rails
- Arquitectura MVC
- Rutes
Mòdul 7: Proves en Ruby
- Introducció a les Proves
- Proves Unitàries amb Minitest
- Desenvolupament Basat en Comportament amb RSpec
- Mocking i Stubbing
Mòdul 8: Millors Pràctiques en Ruby
- Estil de Codi i Convencions
- Refactorització
- Optimització del Rendiment
- Millors Pràctiques de Seguretat