Bastos

let’s code!

Diferença de Pro.new para lambda em Ruby

July 25th, 2008 · No Comments

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

Veja mais aqui e aqui.

Tags: ruby · tips

0 responses so far ↓

  • There are no comments yet...Kick things off by filling out the form below.

Leave a Comment