こんにちは、鈴木です。
便利なメソッドやイディオムの存在を知ってしまったときの楽しさは、Ruby/Railsを使う理由の一つではないでしょうか。
今回は、便利メソッドの宝庫 ActiveSupport からいくつかご紹介したいと思います。
try
try はレシーバが nil でなければ指定したメソッドを呼び出します。
1 2 3 4 5 6 7 8 |
# @user が nil の場合に NoMethodError が発生してしまうので NG. @user.name # あまり綺麗ではない. @user && @user.name # try を使うとこうなります. @user.try(:name) |
メソッドが引数を取る場合は、try の第二引数以降に指定します。
1 2 |
# ユーザの配列 @users があれば, 先頭から 5 つを取得する. @users.try(:take, 5) |
メソッドがブロックを取る場合は以下のように記述します。
1 2 3 4 |
(1..10).try(:select){|x| x.even?} # 次のように書くこともできます. (1..10).try(:select, &:even?) |
blank?
blank? はレシーバが以下の場合に true を返します。
- レシーバが nil の場合
- レシーバが false の場合
- レシーバがホワイトスペースのみを含む文字列の場合
- レシーバが空の配列の場合
- レシーバが空のハッシュの場合
一言で言うなら、オブジェクトが空っぽの時に true を返します。
注意点としては、3 番目の「レシーバがホワイトスペースのみを含む文字列の場合」です。
ここでの「ホワイトスペース」は Unicode で定義されるホワイトスペース、つまり全角スペースも含まれます。
present?
present? は定義を見た方が早いと思います。
1 2 3 |
def present? !blank? end |
presence
presence は present? が true の場合にレシーバ自身を返すメソッドです。
メソッドの定義を見ると、以下のようになっています。
1 2 3 |
def presence self if present? end |
少し変わったメソッドなので何に使うのか、一見して分かりづらいです。
以下のコードを比較すると分かりやすいかもしれません。
1 2 |
host = config[:host] || 'localhost' host = config[:host].presence || 'localhost' |
「host = config[:host] || 'localhost'」という書き方は一般的に良く見るコードです。
host には config[:host] が設定されている場合(nil または false ではない場合)は config[:host] の値、そうでなければ 'localhost' が代入されます。
もう一方の「host = config[:host].presence || 'localhost'」はどうでしょうか。
host には config[:host].present? が true の場合(ホワイトスペースのみなどの無意味な値ではない場合)に config[:host] の値、そうでなければ「localhost」が代入されます。
presence の使いどころの一つとしては、設定ファイルを読み込んだハッシュ(上記の例では config)があり、値が設定されていない項目は空文字列になっている場合があります。
config[:host] が空文字列の場合、「host = config[:host] || 'localhost'」では host には空文字列が代入されてしまいますが、「host = config[:host].presence || 'localhost'」だと 'localhost' が代入されます。
まとめ
名脇役と言っても過言ではない ActiveSupport のメソッドをいくつかご紹介しました。
噛めば噛むほど味が出るメソッドばかりです。