Rubyではnull(nil)を判定するために「nil?」「blank?」などの各種メソッドを利用することが可能です。
本記事では、サンプルコードを掲載しながらnull(nil)判定を行う各種メソッドについて解説していきます。
目次
Rubyではnullではなくnil
Ruby以外のプログラミング言語経験者の中には、「null」と「nil」の違いについて混乱してしまう方もいらっしゃるかと思います。
Rubyでのプログラムにおいては「null」ではなく「nil」が利用されます。
nullとnilの違い
「null」と「nil」はどちらも「存在しない」ことを意味しており、語源の違いや品詞としての違いこそありますが、意味合い自体は変わりません。
Rubyのプログラムにおいては「nil」を利用すると覚えておきましょう。
NilClassについて
Rubyでnilが属しているクラスとして「NilClass」の存在が挙げられます。
nilはNilClass唯一のインスタンスです。
nil判定を行う際にこのNilClassで定義されたメソッドを使用する必要があります。
Rubyにおけるnull(nil)の判定方法
Rubyではnullではなく「nil」を使用すると確認出来たところで、次にnil判定の方法について解説していきます。
nil判定の方法には「nil?」「blank?」「present?」メソッドを利用することが可能です。
nil?
nil?では、対象オブジェクトがnilかどうかを確認することが可能で、nilの場合「true」それ以外は「false」が返却されます。
nilの場合
sample = nil p sample.nil?
実行結果は下記です。
true
nil以外の場合
sample1 = "" sample2 = 0 sample3 = [] p sample1.nil? p sample2.nil? p sample3.nil?
実行結果は下記です。
false false false
オブジェクトが存在しない場合
sample = nil p sample1.nil?
実行結果は下記です。
undefined local variable or method `sample1' for main:Object (NameError)
nilかどうかのチェックをするオブジェクト自体が存在しない場合エラーとなるため注意が必要です。
blank?
「blank?」は「nil」に加えて「空白文字列」「空の配列」なども「true」が返却され、それ以外の実際に値が設定されている場合には「false」が返却されます。
nilまたは空白値の場合
require 'active_support' require 'active_support/core_ext' sample1 = nil sample2 = "" sample3 = " " sample4 = [] p sample1.blank? p sample2.blank? p sample3.blank? p sample4.blank?
実行結果が下記です。
true true true true
「blank?」はrailsのメソッドとなるため、「require ‘active_support’」の記述が必要です。
実際の値が設定されている場合
require 'active_support' require 'active_support/core_ext' sample1 = 0 sample2 = "サンプル" sample3 = ["テスト"] p sample1.blank? p sample2.blank? p sample3.blank?
実行結果が下記です。
false false false
「0」は空白値として該当しそうにも思えますが「blank?」メソッドでは実在する値として判定されます。
present?
「present?」は「blank?」とは反対で、「nil」や「空白文字列」「空の配列」の場合「false」、実際の値が設定されている場合「true」が返却されます。
nilや空白値の場合
require 'active_support' require 'active_support/core_ext' sample1 = nil sample2 = "" sample3 = " " sample4 = [] p sample1.present? p sample2.present? p sample3.present? p sample4.present?
実行結果は下記です。
false false false false
実際の値が設定されている場合
require 'active_support' require 'active_support/core_ext' sample1 = 0 sample2 = "サンプル" sample3 = ["テスト"] p sample1.present? p sample2.present? p sample3.present?
実行結果は下記です。
true true true
「blank?」と「present?」で出力結果が正反対になっていることをご確認頂けます。
empty?について
nil判定に使えるかと誤解してしまいがちなメソッドとして「empty?」が挙げられます。
「empty?」では空白値を調べることは可能ですが、「nil」に関しては判定することが出来ません。
sample1 = "" sample2 = " " sample3 = [] sample4 = nil p sample1.empty? p sample2.empty? p sample3.empty? p sample4.empty?
実行した結果が下記です。
true false true Traceback (most recent call last): test.rb:9:in `': undefined method `empty?' for nil:NilClass (NoMethodError)
「empty?」メソッドは「NilClass」に定義されていないため「NoMethodError」が表示されます。
「empty?」メソッドの場合「半角スペース」や「全角スペース」の場合、値が設定されていると判定され「false」が返却されることを確認しておきましょう。
Rubyでnilガード(nullガード)を試してみよう
Rubyではnil(null)状態を防ぐために、nilガードと呼ばれる書き方が存在します。
基本構文
変数 ||= 指定値
「||=」と記述することで、変数が「nil」の場合に指定値を代入することが可能です。
サンプル
実際にnilガードを使用したサンプルコードで動作確認をしてみます。
sample1 = nil sample2 = "" p sample1 ||= "指定値" p sample2 ||= "テスト"
実行結果が下記です。
"指定値" ""
サンプルのように「nil」が設定されている場合、指定した値で上書きされ、「nil以外」の値が設定されている場合には上書きされることなく既存の変数値が適用されます。
さいごに: Rubyではnullの代わりにnilを利用する
本記事では、Rubyのプログラムで「null」の代わりに利用される「nil」に関する情報と使い方についてご紹介してきました。
他のプログラミング経験者であれば記述法こそ違いますが「null」と同様に扱うことが可能です。
各種判定メソッドにより「null(nil)」に対する結果が変わってきますので、きちんと処理内容を把握して使いこなせるように学習していきましょう。
「null」と「nil」のどちらを利用するかはプログラミング言語により異なります。