ていうか try! って何よ。
a.try(:hoge) #=> nil
a.try!(:hoge) #=> NoMethodError
はーぁん、にゃーるほーどねー。
これ見て初めて気付いたのですが、 「try メソッドには 2 つの効用がある」 のですね。
- a が nil の時、何もしない
- a に hoge が実装されてない時、何もしない
両方の効用を持つのが try
1 つ目の効用しか持たないのが try!
というわけです。
2 つ目の効用も便利っちゃあ便利ですが、メソッド名を typo するとわかりづらいバグになることもありそうです。
実際 try を使うときは、レシーバ (上の例で a ) が nil かどうかで使う 1 つ目の効用を利用したい場合が殆どだと思われるので、積極的に try!
を使っていくといいかと思います。
ruby2.3記念追記
rails にまず導入されたのが try で、その後、「NoMethodErrorを捕捉できないのは危険」ということで try! が rails4 から導入されたようです。そして、 ruby2.3 からは「ぼっち演算子」を try! の代わりに使うことができます。
a.try!(:hoge)
#=>
a&.hoge
NoMethodError を起こさない try と、ブロック渡す try は引き続き現役です。
言語仕様である &.
と、単なるメソッドである try!
にはもう一つ重要な違いアリ。
&.
は nil を受け取るとその先の parsing を停止するので、引数を評価しません。
c=0
nil&.to_s(c+=1) # cは0のまま
nil.try!(:to_s, c+=1) # cは1