Ruby中lambda和 – >运算符的区别

以下两个范围生成相同的结果,哪种语法更可取,还有其他区别吗?

scope :paid, lambda { |state| where(state: state) } scope :paid, ->(state) { where(state: state) } 

出于可读性原因,最好使用新语法-> (在Ruby 1.9中引入)用于单行块,而lambda用于多行块。 例:

 # single-line l = ->(a, b) { a + b } l.call(1, 2) # multi-line l = lambda do |a, b| tmp = a * 3 tmp * b / 2 end l.call(1, 2) 

这似乎是在bbatsov / ruby​​-style-guide中建立的社区惯例。

所以,在你的情况下,会更好:

 scope :paid, ->(state) { where(state: state) } 

->是字面语法,如" 。”其含义由语言规范修复。

Kernel#lambda就像任何其他方法一样。 它可以被覆盖,删除,覆盖,monkeypatched,截获,……

所以,从语义上讲,它们是非常不同的。

它们的表现也可能不同。 Kernel#lambda 至少会有方法调用的开销。 执行引擎实际上无法知道Kernel#lambda在运行时做什么(因为它可能是monkeypatched)这一事实也会阻止任何静态优化,尽管我不相信任何现有的Ruby执行引擎会以任何有意义的方式静态优化lambda文字。

没有区别,两者都返回相同的Proc对象:

 irb(main):033:0> lambda {|x| x*x} => # irb(main):034:0> ->(x) {x*x} => # 

在我看来, ->更具可读性。