下面两个作用域生成相同的结果,哪个语法更好,还有其他的区别吗?
scope :paid, lambda { |state| where(state: state) }
scope :paid, ->(state) { where(state: state) }发布于 2015-01-29 12:53:32
由于可实现性的原因,最好对单行块使用新的语法-> (在Ruby1.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风格指南建立的一个社区会议。
所以,就你而言,最好是:
scope :paid, ->(state) { where(state: state) }发布于 2015-01-29 14:46:07
->是文字语法,就像"。它的意义是由语言规范所确定的。
Kernel#lambda和任何其他方法一样,是一种方法。它可以被重写,删除,覆盖,猴子,拦截,…
所以,在语义上,它们是非常不同的。
它们的表现也有可能不同。Kernel#lambda至少有一个方法调用的开销。执行引擎无法真正知道Kernel#lambda在运行时所做的事情(因为它可以被修改),这也排除了任何静态优化,尽管我不相信任何现有的runtime都会以任何有意义的方式静态地优化lambda文本。
发布于 2015-01-29 12:56:03
没有区别,它们都返回相同的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)>在我看来,->更具可读性。
https://stackoverflow.com/questions/28215047
复制相似问题