LoginSignup
26
20

More than 5 years have passed since last update.

Object#tryの意外な挙動

Last updated at Posted at 2015-06-08

Railsで導入されるActiveSupportには、nilかもしれない値のハンドリングに便利な、tryメソッドがあります。ただ、意外と知らない使い方も多いなあと思ったので、メモ程度に書いていきます。

メソッド以外の引数を付ける

tryメソッドに複数の引数を渡すと、2つ目以降はメソッドの引数となります。

# sliceメソッドを呼ぶ
some_obj.try(:slice, 1, 1)

これを利用することで、HashやArrayからの値取得tryを使うこともできます。

nilに適用した場合は必ずnil

tryの要になる、NilClassでの実装ですが、極めてシンプルです。実際のコードからNilClass#tryの定義だけ抜粋してみました。

active_support/core_ext/object/try.rb
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としてブロックが実行され、その値が返り値になります。例えば、

ブロックだけのtry
number_or_nil.try { "#{self}人" }

のように、1メソッドで済まない処理を行うことができます。

26
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
20