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

def saluda
  puts "Hola!"
  yield if block_given?
  puts "Adéu!"
end

saluda { puts "Com estàs?" }

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.

def repetir(n)
  n.times { yield }
end

repetir(3) { puts "Hola, món!" }

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

proc = Proc.new { |x| puts x }
proc.call(10)

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 un Proc com a argument i l'executa amb call.

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

lambda = ->(x) { puts x }
lambda.call(20)

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 una lambda com a argument i l'executa amb call.

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.

© Copyright 2024. Tots els drets reservats