Ruby中lambda和def method_name之间的区别

时间:2012-04-18 20:04:04

标签: ruby function lambda

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

2 个答案:

答案 0 :(得分:13)

lambda表达式:

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

我建议查看解释过程,块和lambdas的this article

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

答案 1 :(得分: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次......

我建议你看一下这个link进一步阅读:)