10

我正在阅读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 语法似乎更令人困惑,更像意大利面条。

4

2 回答 2

16

拉姆达斯:

  • Procs的变体,
  • 可以转换成块/从转换,
  • 不要开始一个新的闭包范围(这意味着您可以访问在 lambda 范围之外定义的变量,不像def),
  • 可以作为变量传递。

我建议查看这篇解释 procs、blocks 和 lambdas 的文章。

编辑:此链接已过时。为了将来参考,试试这篇文章

于 2012-04-18T20:22:19.567 回答
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 次......

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

于 2012-04-18T20:10:05.110 回答