从方法中选择特定的Lambda

时间:2014-02-04 21:34:41

标签: ruby lambda closures

目前在Ruby中学习更多有关Lambdas的知识,并且遇到了一个我觉得非常有趣的例子:

[106] pry(main)> def another_method
[106] pry(main)*   begin
[106] pry(main)*     lambda { return "Hello World" }
[106] pry(main)*   ensure  
[106] pry(main)*     puts "another_method exits"
[106] pry(main)*   end  
[106] pry(main)* end  
 => :another_method
[107] pry(main)> another_method
another_method exits
=> #<Proc:0x000001013d2af0@(pry):149 (lambda)>
[108] pry(main)> another_method.call
another_method exits
=> "Hello World"

现在我对此的理解是,lambda被执行,保存值并且只在请求时返回它(.call)?

这引出了以下问题:

def some_method
  a =  lambda { return "hello" }
  b =  lambda { return "there" }
end

如果你有上面的场景,有没有办法可以选择调用哪一个并获得它的值?因为如果我这样做,我得到以下内容:

some_method.call => "there"

有关这方面的任何提示,如果可能的话,会很棒!谢谢!

1 个答案:

答案 0 :(得分:1)

试试这个例子:

def some_method(n)
  a =  lambda { return "hello" }
  b =  lambda { return "there" }

  n % 2 == 0 ? a : b
end

你应该得到以下信息:

some_method(2).call
=> "hello"
some_method(1).call
=> "there"

我会试着解释一下我认为你缺少的东西:

在下面的代码中,调用some_method将始终返回b的值,因为它是要执行的最后一行。 (您的其他示例中的代码中的代码不计算在内)

def some_method
      a =  lambda { return "hello" }
      b =  lambda { return "there" }
end

所以,当您执行some_method.call时,您将获得b.call

这就是我的例子说明在lambdas =)

之间进行选择的方式