首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby算子与->算子的区别

Ruby算子与->算子的区别
EN

Stack Overflow用户
提问于 2015-01-29 12:41:48
回答 4查看 7.9K关注 0票数 13

下面两个作用域生成相同的结果,哪个语法更好,还有其他的区别吗?

代码语言:javascript
复制
scope :paid, lambda { |state| where(state: state) }

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

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-01-29 12:53:32

由于可实现性的原因,最好对单行块使用新的语法-> (在Ruby1.9中引入),对多行块使用lambda。示例:

代码语言:javascript
复制
# 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风格指南建立的一个社区会议。

所以,就你而言,最好是:

代码语言:javascript
复制
scope :paid, ->(state) { where(state: state) }
票数 22
EN

Stack Overflow用户

发布于 2015-01-29 14:46:07

->是文字语法,就像"。它的意义是由语言规范所确定的。

Kernel#lambda和任何其他方法一样,是一种方法。它可以被重写,删除,覆盖,猴子,拦截,…

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

它们的表现也有可能不同。Kernel#lambda至少有一个方法调用的开销。执行引擎无法真正知道Kernel#lambda在运行时所做的事情(因为它可以被修改),这也排除了任何静态优化,尽管我不相信任何现有的runtime都会以任何有意义的方式静态地优化lambda文本。

票数 4
EN

Stack Overflow用户

发布于 2015-01-29 12:56:03

没有区别,它们都返回相同的Proc对象:

代码语言:javascript
复制
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)>

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28215047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档