try
是 rails 的一個方法,try!
是他的另一個版本
&.
(safe navigation operator) 是 ruby 的一個運算子
其中 try!
跟 &.
的結果很相似,他們 跟 try
比起來比較嚴謹,會去 check receiver 是否為 nil
,如果都用只用 try
,反而會導致都回傳 nil
而發生錯誤時也不知道在哪
try()
比方說我們想要呼叫一個物件的方法,當物件是 nil 的時候 Rails 會給 method_missing 的例外
1 | if current_user.is_admin? |
使用 try
就可以避免這種問題,不管 receiver 是 nil 還是 receiver 沒有這個方法都會回傳 nil
1 | if current_user.try(:is_admin?) |
try!()
如果 try!
的 receiver 是 nil 的話,不會去執行後面的方法,但不是 nil 的話,這個 receiver 沒有 try!
參數內的方法的話會給出 No method error 而不是 nil
&.
&.
的結果跟 try!
很像,但語意上不太相同
如果今天使用下面這樣的表示
1 | if current_user&.(is_admin?) |
這邊的 current_user&.(is_admin?)
代表 current_user && current_user.is_admin?
也就是 current_user 存在的話再做後面的那件事情,但 try!
的語意會比較偏向試試看能不能執行的感覺
我原本覺得 try!
跟 &.
應該是一樣的東西,跟同事討論之後得出以上的結論,如果大家有意見歡迎討論
參考資料: