おはようございます。また今日から一週間が始まりましたが、頑張っていきましょう。
さて今回はタイトルのようによく混乱してしまうnil?
やempty?
メソッドなどの挙動について細かくみていきたいと思います。これを曖昧なまま実務で本番のコードを触ってしまい、バグを生んでしまい反省からこの記事を書いています。
nil?メソッド
レシーバがnil
であればtrue
を返すメソッドです。Object
クラスに属しています。
nil.nil?
=> true
"hoge".nil?
=> false
false.nil?
=> false
"".nil?
=> false
" ".nil?
=> false
{}.nil?
=> false
[].nil?
=> false
見ての通りnil(NilClass)
でない限りfalse
になります。
empty?メソッド
中身が空かどうかを判別するメソッドです。StringクラスとArrayクラスに属しています。
"".empty?
=> true
"hoge".empty?
=> false
" ".empty?
=> false
[].empty?
=> true
{}.empty?
=> true
nil.empty?
NoMethodError: undefined method `empty?' for nil:NilClass
false.empty?
NoMethodError: undefined method `empty?' for false:FalseClass
0.empty?
NoMethodError: undefined method `empty?' for 0:Integer
注意したい点として、あくまで空かどうかを判別するメソッドなので、nilだったりfalseの場合はNoMethodError
になるという点です。やってしまいがちな記述として以下のような例が挙げられます。
user = User.new
=> #<User:0x00007ff388429fe0 id: nil, email: nil, password_digest: nil, created_at: nil, updated_at: nil>
user.email.nil?
=> true
#emailの中身はnilなので、empty?は使えない
user.email.empty?
NoMethodError: undefined method `empty?' for nil:NilClass
blank?メソッド
nil
の場合も""
や{}
の場合もtrue
を返したいときに使います。ただし、falseでもtrueが返るので注意。僕はこれでバグを生んでしまいました。こちらはRailsで拡張されて使えるメソッドです。
"".blank?
=> true
" ".blank?
=> true
nil.blank?
=> true
false.blank?
=> true
"hoge".blank?
=> false
{}.blank?
=> true
[].blank?
=> true
3.blank?
=> false
0.blank?
=> false
nil
や""
の場合はもちろん、" "
やfalse
でもtrue
が返っています。開発で真偽値の判定をするときはこの挙動を頭に入れてどのメソッドを使うか慎重に判断する必要があります。
present?メソッド
present?
メソッドは存在するかどうかを判別するメソッドです。!blank
メソッドと同じ挙動をします。こちらもfalseではfalseが返るので注意が必要です。
"".present?
=> false
" ".present?
=> false
nil.present?
=> false
false.present?
=> false
{}.present?
=> false
[].present?
=> false
0.present?
=> true
presenceメソッド
最後に上のメソッドに関連して、便利だなと思ったpresence
メソッドについて紹介していきたいと思います。presence
メソッドはその名の通りで、present?
メソッドでtrue
ならばレシーバを返し、それ以外ならnil
を返します。
"".presence
=> nil
nil.presence
=> nil
{}.presence
=> nil
0.presence
=> 0
"hoge".presence
=> "hoge"
さいごに
いかがだったでしょうか。真偽値判定に使える様々なメソッドを紹介してきました。まだ経験が浅いですが僕の見てきた中ではnil?やblank?メソッドやpresent?メソッドが登場する機会としては多いかなと肌感覚としてあります。
これらの挙動を理解せずに実装し、バグを生んでしまった僕みたいにならないようにしっかり理解しておくといいと思います。
ここまで読んでいただきありがとうございました!