En este post vamos a hablar de como su usan los procs y lambdas en Ruby así como las diferencias que existen entre ambos.
La primera diferencia que existe entre ambos es en el paso de parámetros.
ruby-1.9.3-p125 :003 > p = proc{|x, y| puts x+y}
=> #<Proc:0x000000067de2a8@(irb):3>
ruby-1.9.3-p125 :004 > p.call 1,2
3
=> nil
ruby-1.9.3-p125 :006 > p.call 1,4,"prueba"
5
=> nil
ruby-1.9.3-p125 :007 > l = lambda{|x, y| puts x+y}
=> #<Proc:0x000000068f1d20@(irb):7 (lambda)>
ruby-1.9.3-p125 :010 > l.call 1,2
3
=> nil
ruby-1.9.3-p125 :011 > l.call 1,2, "prueba"
ArgumentError: wrong number of arguments (3 for 2)
...
Como podemos ver proc ignora los demás parámetros que le pasamos a mayores, sin embargo lambda da un error.
Comportamiento con el método return:
ruby-1.9.3-p125 :018 > l = lambda do
ruby-1.9.3-p125 :019 > 1 +2
ruby-1.9.3-p125 :020?> return "funciona"
ruby-1.9.3-p125 :021?> 3 + 4
ruby-1.9.3-p125 :022?> end
=> #<Proc:0x00000006940498@(irb):18 (lambda)>
ruby-1.9.3-p125 :023 > l.call
=> "funciona"
ruby-1.9.3-p125 :019 > 1 +2
ruby-1.9.3-p125 :020?> return "funciona"
ruby-1.9.3-p125 :021?> 3 + 4
ruby-1.9.3-p125 :022?> end
=> #<Proc:0x00000006940498@(irb):18 (lambda)>
ruby-1.9.3-p125 :023 > l.call
=> "funciona"
ruby-1.9.3-p125 :024 > p = proc do
ruby-1.9.3-p125 :025 > 1 +2
ruby-1.9.3-p125 :026?> return "funciona"
ruby-1.9.3-p125 :027?> 3 + 4
ruby-1.9.3-p125 :028?> end
=> #<Proc:0x00000005976030@(irb):24>
ruby-1.9.3-p125 :029 > p.call
LocalJumpError: unexpected return
ruby-1.9.3-p125 :025 > 1 +2
ruby-1.9.3-p125 :026?> return "funciona"
ruby-1.9.3-p125 :027?> 3 + 4
ruby-1.9.3-p125 :028?> end
=> #<Proc:0x00000005976030@(irb):24>
ruby-1.9.3-p125 :029 > p.call
LocalJumpError: unexpected return
ruby-1.9.3-p125 :030 > def ejemplo_proc
ruby-1.9.3-p125 :031?> p = Proc.new { return "asi me permite hacer return"}
ruby-1.9.3-p125 :032?> p "tambien lo veo"
ruby-1.9.3-p125 :033?> p.call
ruby-1.9.3-p125 :034?> p "esto ya no lo puedo ver"
ruby-1.9.3-p125 :035?> end
=> nil
ruby-1.9.3-p125 :036 > ejemplo_proc
"tambien lo veo"
=> "asi me permite hacer return"
ruby-1.9.3-p125 :031?> p = Proc.new { return "asi me permite hacer return"}
ruby-1.9.3-p125 :032?> p "tambien lo veo"
ruby-1.9.3-p125 :033?> p.call
ruby-1.9.3-p125 :034?> p "esto ya no lo puedo ver"
ruby-1.9.3-p125 :035?> end
=> nil
ruby-1.9.3-p125 :036 > ejemplo_proc
"tambien lo veo"
=> "asi me permite hacer return"
ruby-1.9.3-p125 :037 > def ejemplo_lambda
ruby-1.9.3-p125 :038?> p = lambda { return "asi me permite hacer return"}
ruby-1.9.3-p125 :039?> p "tambien lo veo"
ruby-1.9.3-p125 :040?> p.call
ruby-1.9.3-p125 :041?> p "esto ya no lo puedo ver"
ruby-1.9.3-p125 :042?> end
=> nil
ruby-1.9.3-p125 :043 > ejemplo_lambda
"tambien lo veo"
"esto ya no lo puedo ver"
=> "esto ya no lo puedo ver"
ruby-1.9.3-p125 :038?> p = lambda { return "asi me permite hacer return"}
ruby-1.9.3-p125 :039?> p "tambien lo veo"
ruby-1.9.3-p125 :040?> p.call
ruby-1.9.3-p125 :041?> p "esto ya no lo puedo ver"
ruby-1.9.3-p125 :042?> end
=> nil
ruby-1.9.3-p125 :043 > ejemplo_lambda
"tambien lo veo"
"esto ya no lo puedo ver"
=> "esto ya no lo puedo ver"
No comments:
Post a Comment