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} => #
在我看来, ->
更具可读性。