![](/img/trans.png)
[英]What is the difference between `try` and `&.` (safe navigation operator) in Ruby
[英]Difference between lambda and -> operator in Ruby
以下兩個范圍生成相同的結果,哪種語法更可取,還有其他區別嗎?
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}
=> #<Proc:0x007ff525b55b90@(irb):33 (lambda)>
irb(main):034:0> ->(x) {x*x}
=> #<Proc:0x007ff525b7e068@(irb):34 (lambda)>
在我看來, ->
更具可讀性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.