Rails 的 try(), try! 跟 Ruby 的 &.

Posted by Anthony Chao on 2019-12-22

try 是 rails 的一個方法,try! 是他的另一個版本

&. (safe navigation operator) 是 ruby 的一個運算子

其中 try!&. 的結果很相似,他們 跟 try 比起來比較嚴謹,會去 check receiver 是否為 nil,如果都用只用 try,反而會導致都回傳 nil 而發生錯誤時也不知道在哪

try()

比方說我們想要呼叫一個物件的方法,當物件是 nil 的時候 Rails 會給 method_missing 的例外

1
2
3
4
if current_user.is_admin?
# ...
# 這時候如果 current_user 是 nil 會跑出 method_missing 的例外
end

使用 try 就可以避免這種問題,不管 receiver 是 nil 還是 receiver 沒有這個方法都會回傳 nil

1
2
3
4
if current_user.try(:is_admin?)
# ...
# 這時候如果 current_user 是 nil 就不會呼叫後面的 is_admin? 方法
end

try!()

如果 try! 的 receiver 是 nil 的話,不會去執行後面的方法,但不是 nil 的話,這個 receiver 沒有 try! 參數內的方法的話會給出 No method error 而不是 nil

&.

&. 的結果跟 try! 很像,但語意上不太相同

如果今天使用下面這樣的表示

1
2
3
if current_user&.(is_admin?)
# ...
end

這邊的 current_user&.(is_admin?) 代表 current_user && current_user.is_admin?

也就是 current_user 存在的話再做後面的那件事情,但 try! 的語意會比較偏向試試看能不能執行的感覺

我原本覺得 try!&. 應該是一樣的東西,跟同事討論之後得出以上的結論,如果大家有意見歡迎討論

參考資料:

ihower

try、try! 和 &.

Leon’s Blog





prevent_hack