簡體   English   中英

Ruby中lambda和 - >運算符的區別

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM