• 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 y break 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"]