Rubyでのプログラム開発では「nil」という他のプログラミング言語よっては見かけないワードを頻繁に目にすることになります。
本記事では、「nil」についての基本的な情報から判定方法と使い方についてご紹介していきます。
nilとは
「nil」は存在しない状態を表す意味合いとして利用されます。
プログラミングにおいては「0」や「””」も何もない状態が存在すると捉えられますが、「nil」は文字通り存在しない状態を表します。
nilとnullの違い
「nil」と同様に存在しない状態を表す「null」が存在しますが、Rubyでは「nil」が使用されているだけで違いはありません。
「nil」と「null」では品詞が異なることや語源が異なるなどの違いがあるようですが、意味合い自体は変わりません。
NilClass
「nil」は「NilClass」のオブジェクトです。
後述しますが、nil判定に利用出来るのはNilClassが持つメソッドのみで、例えば「empty?」などでnil判定を実施しようとするとエラーとなってしまうため注意が必要です。
nilの判定方法
nilの判定には「nil?」「blank?」「present?」が利用可能です。
「empty?」を利用した場合も含めて動作を確認してみましょう。
nil?
「nil?」はRubyでnil判定を実施する際に利用可能なメソッドです。
判定対象がnilの場合は「true」nil以外の場合には「false」が返却されます。
nilの場合
sample = nil p sample.nil?
実行結果は下記です。
true
nil以外の場合
sample = "" p sample.nil?
実行結果は下記です。
false
blank?
「blank?」では、「nil」の場合に加えて「空の配列」や「空白文字」の場合にも「true」を返却し、それ以外の場合「false」を返却します。
nilや空白値の場合
require 'active_support' require 'active_support/core_ext' sample1 = nil sample2 = "" sample3 = [] p sample1.blank? p sample2.blank? p sample3.blank?
実行結果が下記です。
true true true
値が設定されている場合
require 'active_support' require 'active_support/core_ext' sample1 = "テスト" sample2 = [0] p sample1.blank? p sample2.blank?
実行結果が下記です。
false false
present?
「present?」は同じく「Ruby on Rails」のメソッドで、「blank?」とは反対に「nil」や「空の配列」「空白文字」の場合に「false」を返却します。
nilや空白値の場合
require 'active_support' require 'active_support/core_ext' sample1 = nil sample2 = "" sample3 = [] p sample1.present? p sample2.present? p sample3.present?
実行結果が下記です。
false false false
値が設定されている場合
require 'active_support' require 'active_support/core_ext' sample1 = "あいうえお" sample2 = [1] p sample1.present? p sample2.present?
実行結果が下記です。
true true
empty?
では「empty?」メソッドはというと、「空の配列」や「空白値」の場合には「true」を返却しますが、「nil」の場合にはエラーが発生してしまいます。
require 'active_support' require 'active_support/core_ext' sample1 = "" sample2 = [] sample3 = nil p sample1.empty? p sample2.empty? p sample3.empty?
実行結果が下記です。
true true Traceback (most recent call last): test.rb:10:in `': undefined method `empty?' for nil:NilClass (NoMethodError)
「nil」をチェックしようとした際、「for nil:NilClass」によるエラーが発生していることをご確認頂けます。
このエラーはNilClassに「empty?」が定義されていないことによるエラーで「nil」に対しては利用出来ないことを意味しています。
Rubyのnilガードを使ってみよう
Rubyには「nilガード」と呼ばれる手法が存在し、変数が「nil」や値の入っていない場合に指定した値を代入することが出来ます。
基本構文
nilガードの記述方法は下記のような形です。
変数 ||= 指定値
「||=」の記述により、左辺に設定された変数が「nil」または「false」となる値の場合には右辺に指定した「指定値」を代入するというものです。
変数に何らかの値が設定されている場合には「指定値」の値が代入されることはありません。
サンプル
例えば変数に「nil」が設定された状態で「empty?」を使用するとエラーとなっていましたが、nilガードを実行しておくことで指定値を代入することができ、エラーを回避することが可能です。
sample1 = nil sample1 ||= "" p sample1
実行結果が下記です。
""
もちろん下記サンプルのように、変数に既に値が設定されている場合にはnulガードで値が上書きされることはありません。
sample1 = "テスト" sample1 ||= "" p sample1
実行結果が下記です。
"テスト"
配列からnilを取り除くcompactメソッド
「nil」に関連する処理の中で合わせて覚えておきたいのが、配列の中に含まれたnilを削除出来る「compact」メソッドです。
基本構文
compactメソッドの使い方は簡単で、配列に対して「compact」メソッドを実行するだけです。
配列.compact
サンプル
実際に簡単なサンプルコードで「compact」メソッドの処理内容を確認してみましょう。
animals = ["さる", nil, "とり", nil, nil, "いぬ", nil] p animals.compact
実行結果が下記です。
["さる", "とり", "いぬ"]
「nil」の値が削除され、存在する値のみで構成された配列が返却されていることをご確認頂けます。
さいごに: Rubyでのシステム開発においてnilの理解は必須
本記事では、Rubyのシステム開発における必須知識「nil」の基本的な情報から判定方法までサンプルコードを掲載しながらご紹介してきました。
プログラミング初心者の方には特に分かりにくい「nil」や「null」の概念ですが、システム開発を行う上では必須知識の1つです。
今回ご紹介した基本情報をしっかりと抑えた上で「nil」をうまく扱えるよう学習していきましょう。
「blank?」は「Ruby on Rails」で利用可能なメソッドですので、「active_support」を「require」で呼び出しておく必要があります。