【问题标题】:Difference between lambda and def method_name in RubyRuby 中 lambda 和 def method_name 的区别
【发布时间】:2012-04-30 07:41:55
【问题描述】:

我正在阅读pickaxe 1.9,作者这样使用lambda:

bo = lambda {|param| puts "You called me with #{param}"}
bo.call 99     => 'You called me with 99'
bo.call "cat"  => 'You called me with cat'

我的问题是:与仅仅定义一个做同样事情的方法相比,这有什么更好/更差/不同的地方?像这样:

def bo(param)
  puts "You called me with #{param}"
end

bo("hello") => 'You called me with hello'

对我来说,lambda 语法似乎更令人困惑,更像意大利面条。

【问题讨论】:

  • 另外 lambda 是一个特殊的 Proc。这不是一种方法。

标签: ruby function lambda


【解决方案1】:

Lambda:

  • Procs的变体,
  • 可以转换为blocks
  • 不要开始新的closure scope(这意味着您可以访问定义在 lambda 范围之外的变量,这与 def 不同),
  • 可以作为变量传递。

我建议查看 this article,它解释了 procs、blocks 和 lambdas。

编辑:此链接已过时。供将来参考,请尝试this article

【讨论】:

  • 非常简单的答案!这就是我要寻找的一切
【解决方案2】:

定义 lambda 给您的好处是您可以将该 lambda 对象作为属性传递给另一个方法。

def method1 &b
  #... some code
  b.call
end

def method2 &b
  #... some more code...
  b.call
end

def method3 &b
  b.call
  #even more code here
end

myCallback = lambda { "this is a callback that can be called from several methods"}

然后你可以像这样使用它:

method1 &myCallback
method2 &myCallback
method3 &myCallback

这个的美妙之处在于,你只写了一次回调的代码,但使用了 3 次......

我建议您查看此link 以进一步阅读:)

【讨论】:

  • 块的情况下,也可以用yield代替block.call。这实际上是首选,因为它更快。
猜你喜欢
  • 1970-01-01
  • 2018-08-15
  • 2010-12-16
  • 2013-07-04
  • 2016-06-14
  • 2017-05-15
  • 2011-10-12
  • 2012-04-25
相关资源
最近更新 更多