はじめに
ruby
のメソッドに対して使う!と、Rails
のメソッドに対して使う!では、意味が異なるので簡単にまとめてみました。
簡潔に言うと...
●ruby
の場合
注意喚起。今からオブジェクトに対して何らかの変化を加えますよ〜とういう合図。
例:uniq! reverse!
●ActiveRecord
の場合
メソッドを実行した結果の返却値がnilの場合に例外を発生させる。
例:save! update!
● rubyの場合
hoge = [1,2,2,3,3]
hoge.uniq! #たまに見かけるこれ!
●uniq
とuniq!
何が違うの?
uniq
配列から重複した要素を取り除いた新しい配列を返す。
uniq!
削除を破壊的に行い元の配列をの値を操作する。
hoge = [1,2,2,3,3]
hoge.uniq
p hoge #-> [1,2,2,3,3]
hoge.uniq!
p hoge #-> [1,2,3]
●まとめると...
!
は配列を破壊的に操作すると言う注意喚起を意味しています。
(慣習的に!は注意喚起に使われることが多い様です。)
uniq
の場合は、!
をつけることで、配列そのものに変更を加えています。
● ActiveRecordの場合
def update
@hoge = Hoge.find(params[:id])
@hoge.save! #よく見かけるこれ!
end
● save
とsave!
何が違うの?
save
レコードの保存に失敗 → nilを返す
save!
レコードの保存に失敗 → 例外を発生させる
●まとめると...
!
はメソッドの処理が失敗した場合に、例外処理を行うと言う意味を持たせています。
番外編
● 例外処理とは
例えば、「入力された2つの数を足し合わせて結果を返す」コードがあるとき、利用者が入力欄に「あ」と書き入れると数値の足し算の処理は実行不可能となる。
このようなプログラムが通常の処理では想定していない事態や事象を「例外」(exception)と呼び、例外が生じた時の対応を記述したコードを例外処理という。
つまり、何らかの予期せぬエラーが発生した際に、別の処理を行うこと。