概要
nil に対してメソッドを実行しようとすると、undefined method for nil:NilClass
が発生します。
nil[:hoge]
# <anonymous>': eval:1:in `<main>': undefined method `[]' for nil:NilClass (NoMethodError)
本記事では初学者の方向けに undefined method for nil:NilClass
を回避するためのテクニックについてまとめました。
Tips.
nil?
最も基本的な方法です。
nil?
メソッドを使ってnil
であるかを事前にチェックします。
if obj.nil?
# objがnilの場合の処理
{}
else
# objがnilでない場合の処理
obj[:hoge]
end
nil
であるかどうかを確認することで、エラーの発生を防ぐことができます。
nil.to_h
nil
に対してto_h
メソッドを呼び出すと、空のハッシュ {}
を返します。
ハッシュとして扱いたいがnil
である可能性があるオブジェクトに対して、安全にメソッドを呼び出すことができます。
obj = nil
hash = obj.to_h
hash[:hoge] # => nil(エラーにならない)
nil.to_a
同様に、nil.to_a
は空の配列 []
を返します。
配列として扱いたいがnil
である可能性があるオブジェクトに対して、安全にメソッドを呼び出すことができます。
obj = nil
array = obj.to_a
array.each do |item|
# 処理
end
Hash(nil)
Hashメソッドにnilを渡すと、空のハッシュ{}
を返します。
obj = nil
hash = Hash(obj)
hash[:hoge] # => nil(エラーにならない)
Array(nil)
Arrayメソッドにnilを渡すと、空の配列[]
を返します。
obj = nil
array = Array(obj)
array.each do |item|
# 処理
end
dig
ハッシュから値を取得する際に、dig
メソッドを利用できます。
※ デフォルト値を使用したい場合はfetch
を利用
params = nil
value = params.to_h.dig(:hoge) # => nil(エラーにならない)
キーが存在しない場合やparams
がnil
の場合でも、例外が発生しません。
presence (ActiveSupport)
presence
メソッドは、オブジェクトが存在する場合はそのオブジェクトを、nil
や空の場合はnil
を返します。
value = obj.presence || 'デフォルト値'
これにより、オブジェクトが存在しない場合にデフォルト値を設定できます。
カスタムメソッドの定義
NilClass
に対してメソッドを定義することで、nil
オブジェクトでも特定のメソッドを呼び出せるようにする方法です。
class NilClass
def [](key)
nil
end
end
nil[:hoge] # => nil(エラーにならない)
この方法は全体の挙動に影響を与える可能性があるため、注意が必要です。
まとめ
何かと例外が発生することがあるので、こういった小技を頭の片隅に入れておくと良いと思います。
良いRubyライフを!