2015-11-16 29 views
6

Ruby 2.3.0引入了安全導航語法,通過引入一個新的操作符,如果前面的語句值不是,只會調用該方法,從而簡化了對鏈式方法調用的零處理。這是一個在C#,Groovy和Swift中已經存在的功能。例如in Groovy,語法是爲什麼Ruby使用自己的語法來安全的導航操作符?

foo?.bar 

這基本上意味着所述結果值是,foo.bar除非FOO,在這種情況下的返回值也和因此不會引發異常。還有C#(稱爲無效條件運算符)和Swift(稱爲可選鏈表達式)使用此表示法。

所以語法在其他語言中似乎是相當標準的。現在,爲什麼Ruby中的語法是

foo&.bar 

改爲?

+4

'foo?.bar'的意思是「調用方法'foo?',然後調用方法'bar'結果。 2.3.0是一個向後兼容的版本,你提出的語法會導致**巨大的**破壞,它至少會*需要幾年的棄用警告才能被引入。 –

回答

11

這個回答是基於Ruby的問題跟蹤中的the discussion of the feature request。根據Ruby's author Yukihiro Matsumoto,不可能在Ruby中引入運營商?.,因爲foo?是有效的方法名稱,因此無法分析。運營商的第一個候選人是顛倒序列.?。該語法是already implemented(由Nobuyoshi Nakada撰寫),但後來被廢棄,因爲它被認爲與其他語言引入的原始語法太接近(如前所述,這是不可行的)。最終語法&.被松本接受爲suggested

下面是松本

給予我想這一段時間,並引入&.代替.?的思維這句法的理由,是因爲:

  • .?類似於?.在Swift和其他語言,但無論如何都是不同的。
  • 由於?是Ruby中方法名稱的有效後綴,我們在程序中已經看到很多問號。
  • u&.profile提醒我們作爲u && u.profile的簡寫形式。

&.行爲應該保持,即,它應該跳過nil但承認false

該語法隨後作爲Ruby 2.3.0-preview1的一部分發布。

+2

如果您希望您的答案不是無意義的複製和粘貼,而是有用的資源,則無需逐字引用討論;你至少應該糾正其中的語法錯誤(使用諸如'[]'的編輯標記),或者更好地用你自己的話來重新修飾它。目前還不清楚「跳過」零「但認出」錯誤「的含義。你能說清楚這是什麼意思嗎?沒有它,你的問題和答案只是討論的副本,我看不到任何價值。 – sawa

+1

Matz在他的RubyConf 2015主題演講中也解釋了這種選擇操作符的相同理由。觀看視頻比引用的錯誤報告更容易理解。 他指出'&.'被稱爲「孤獨的操作者」(有些想象力,可以看作是一個孤獨的人,坐在地板上盯着他們面前的圓點)。 請參閱幻燈片78-87,時間爲15:00至17:40 [YouTube主題視頻](https://www.youtube.com/watch?v=LE0g2TUsJ4U) –

相關問題