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
endExemple Pràctic
Explicació:
- El mètode
saludaimprimeix "Hola!". - Si es passa un bloc,
yieldexecuta 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_procaccepta unProccom 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 10Lambdas
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_lambdaaccepta unalambdacom 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 7Resum
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
