Um colega estava com um problema, algo como isso aqui não funcionava como ele desejava:
def g
x = Proc.new { return 'ok' }
x.call
puts "Não irá mostrar isso"
end
Depois da chamada do pro x não se conseguia mais executar o resto da função. Ai tentando com lambda:
def g
x = lambda { return 'ok' }
x.call
puts "Irá mostrar isso"
end
Depois da chamada de x a função continuava a ser executada, procurando a diferença, bem é o seguinte, todo o centexto externo é passado para o Proc e assim se é chamado return ele não só executa return no escopo dele, ele executa um return no escopo externo! O mesmo não acontece com o lambda, que apesar de ver o contexto externo ele não “pega” para si esse contexto e usa como se fosse o dele.
Olhe esse exemplo:
def x
y = 1
f = Proc.new{ return y + 1 }
f.call
puts y
end
def z
h = 1
f = lambda { return h + 1 }
f.call
puts h
end
puts 'x:'
x()
puts 'z:'
z()
Vai imprimir:
x: z: 1
Olhem esse outro:
def x
y = 1
puts Proc.new{ y = y + 1 }.call
puts y
end
def z
h = 1
puts lambda { h = h + 1; return h }.call
puts h
end
puts 'call x'
x()
puts 'call z'
z()
No proc ele muda o valor e sem o return dentro ele não saí do contexto de x, já o lambda altera o valor e mesmo com return não sai do contexto de z.
call x 2 2 call z 2 2

0 responses so far ↓
There are no comments yet...Kick things off by filling out the form below.
Leave a Comment