Ruby中lambda和def method_name有什么区别?

10

我正在阅读《Ruby程序设计》第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语法看起来更加混乱和像意大利面一样交织在一起。


1
同时,lambda是一个特殊的Proc。它不是一个方法。 - SwiftMango
2个回答

16

Lambda表达式:

  • Proc过程的变种,
  • 可以转换为/blocks块,
  • 不会开始新的闭包作用域(这意味着您可以访问在lambda范围之外定义的变量,与def不同),
  • 可以作为变量传递。

我建议查看这篇文章,其中解释了procs、blocks和lambdas。

编辑:此链接已过时。将来请尝试这篇文章


很棒的简单答案!这就是我正在寻找的一切。 - Ivan Wang

3
定义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次....

我建议您查看此链接以了解更多信息 :)


1
在块的情况下,您也可以使用 yield 而不是 block.call。事实上,这更受欢迎,因为它更快。 - Holger Just

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接