Monday, January 21, 2013

proc y lambda en Ruby


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 :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 :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 :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"

No comments:

Post a Comment