Railsで導入されるActiveSupportには、nil
かもしれない値のハンドリングに便利な、try
メソッドがあります。ただ、意外と知らない使い方も多いなあと思ったので、メモ程度に書いていきます。
メソッド以外の引数を付ける
try
メソッドに複数の引数を渡すと、2つ目以降はメソッドの引数となります。
# sliceメソッドを呼ぶ
some_obj.try(:slice, 1, 1)
これを利用することで、HashやArrayからの値取得にtry
を使うこともできます。
nil
に適用した場合は必ずnil
try
の要になる、NilClass
での実装ですが、極めてシンプルです。実際のコードからNilClass#try
の定義だけ抜粋してみました。
class NilClass
def try(*args)
nil
end
end
このように、ただnil
を返しているだけです。このため、.try(:to_s, :delimited)
のように、本来nil
に適用すればArgumentError
となってしまうような引数をつけていてもエラーを出さずにnil
を返してくれますが、nil.try(:nil?)
のように、nil
にきちんと適用できるメソッドであっても返り値はnil
となってしまいます。
ブロックを渡す
try
にブロックを渡す場合、2通りの意味があります。
まず、メソッド指定をした上でブロックも渡す場合、ブロックはそのメソッドに渡されます。Enumerableかもしれない値に集計メソッドをtry
で渡す場合に、威力を発揮します。
一方で、メソッドを渡さずに、ブロックだけを渡すこともできます。この場合、レシーバーがnil
でなければ、そのオブジェクトをself
としてブロックが実行され、その値が返り値になります。例えば、
number_or_nil.try { "#{self}人" }
のように、1メソッドで済まない処理を行うことができます。