- Los proc se crean de la siguiente forma:
p = Proc.new {|bla| puts "I'm a proc that says #{bla}!" }
p = proc {|bla| puts "I'm a proc that says #{bla}!" }
- Las lambda se crean de la siguiente forma:
lmb = lambda {|bla| "I'm also a proc, and I say #{bla}" }
also_lmb = ->(bla) { "I'm also a proc, and I say #{bla}" }
Diferencias
- Procs son como blocks, lambdas son como m茅todos an贸nimos.
- Lambdas son estrictas en sus argumentos, si le pasas muchos o pocos
argumentos devuelve una excepci贸n. En el caso de blocks y procs si pasas muchos
los ignora y si pasas pocos pone los restantes a
nil
- Los
return
ybreak
en procs y lambdas se comportan diferentes. El return en un proc se ejecuta en el scope donde se defini贸 el bloque. En lambdas return y break devuelven el control al que lo ha llamado. next
se comporta igual en los tres casos.
Usar la abreviatura de invocaci贸n de proc
cuando el m茅todo invocado es la
煤nica operaci贸n de un bloque. Ejemplo sacado de la gu铆a de estilos Rubocop
names = ["Pepe", "Juan", "Rosa", "Violeta"]
# BAD
upper_names = names.map { |name| name.upcase }
# ["PEPE", "JUAN", "ROSA", "VIOLETA"]
# GOOD
upper_names = names.map(&:upcase)
# ["PEPE", "JUAN", "ROSA", "VIOLETA"]