lambda和 - >之间的差异Ruby中的运算符

时间:2015-01-29 12:41:49

标签: ruby-on-rails ruby lambda

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

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

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

3 个答案:

答案 0 :(得分:13)

由于可读性的原因,最好使用新的语法->(在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) }

答案 1 :(得分:4)

->是文字语法,如"。其含义由语言规范确定。

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

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

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

答案 2 :(得分:2)

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

irb(main):033:0> lambda {|x| x*x}
=> #<Proc:0x007ff525b55b90@(irb):33 (lambda)>
irb(main):034:0> ->(x) {x*x}
=> #<Proc:0x007ff525b7e068@(irb):34 (lambda)>

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