def hola &block
  block.call
end

hola {puts "Yeeeeeeepee"}

Output

Yeeeeeeepee

Quan definim una variable amb un & no estem reben una variable, estem reven un block.

Ho comprovem:

def hola &block
  puts block.class.name
  block.call
end

hola {puts "Yeeeeeeepee"}

Output

Proc
Yeeeeeeepee

La diferència entre un block i un proc.

  • Els block no són objecte i el proc sí.
  • Els block poden ser magatzemats en variables i cridats com arguments, no es poden intercanviar.
  • Un mètode pot rebre un block però pot rebre diversos proc.
def hola proc1, proc2k
  proc1.call
  proc2.call
end

proc1 = Proc.new { puts "Hola proc1" }
proc2 = Proc.new { puts "Hola proc2" }

hola(proc1,proc2)

Output

Hola proc1
Hola proc2

Quan cal utilitzar un block i quan cal utilitzar un proc?

Per defecte cal utilitzar block a menys que hi haja una determinada raó com magatzemar una variable.

Els blocks són més ràpids.