Ruby on rails lambda和->;Ruby中的运算符

Ruby on rails lambda和->;Ruby中的运算符,ruby-on-rails,ruby,lambda,Ruby On Rails,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) # mul

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

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)
这似乎是一个建立于年的社区惯例

因此,在您的情况下,最好是:

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

没有区别,两者都返回相同的
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)>
irb(main):033:0>lambda{| x | x*x}
=> #
irb(主):034:0>->(x){x*x}
=> #

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

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

Kernel#lambda
是一种与任何其他方法一样的方法。它可以被覆盖、删除、覆盖、修补、截获

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

它们的性能也可能不同。
Kernel#lambda
至少会有方法调用的开销。事实上,执行引擎实际上无法知道
Kernel#lambda
在运行时做了什么(因为它可以被修补)还将排除任何静态优化,尽管我不相信任何现有的Ruby执行引擎以任何有意义的方式静态优化lambda文本