【Ruby入門】nilのポイントまとめ(nil? empty? blank? present?)

こんにちは! フリーエンジニアの長瀬です。

みなさんはnilをうまく扱う方法をご存じですか?

今日はRubyのnilについて解説していきたいと思います。

nilはプログラミング独特の概念で初心者の方は特に戸惑いやすい知識です。

そんなnilについて

  • nilとは
  • NilClassとは
  • nilの判定
  • if文の条件式でのnilとfalse

という基本的な内容から、

  • nilガード
  • compactで配列の中のnilを取り除く

といった応用的な内容についても解説していきます。

nilの基本的な知識

nilとは

nilとは一言で言うと「何も存在しない」という意味です。

何もないと言われると、「数字の0」や「空集合」や「false」などをイメージされるかもしれませんが、それらはプログラミング界では「存在するもの」として扱われます。

[nilじゃないものの例]

上記の例では、確かに[]0、そしてfalseは存在していてnilではないんです。

[nilである例]

nilを代入しているのでこちらはもちろんnilです。

とにかく、nilと聞いたら、「何もない」というイメージを持つようにしましょう。

NilClassとは

値nilをもつ変数にempty?メソッドを使用すると、

などのようなエラーメッセージが表示されます。

このエラーメッセージ中にある「NilClass」は、nilが属しているクラスです。

nilは「NilClass」クラスのオブジェクトです。

そのため、nilオブジェクトの持つインスタンスメソッドとクラスメソッドは、「NilClass」クラスで定義されたインスタンスメソッドとクラスメソッドのみになります。

そして、「empty?」メソッドは「NilClass」クラスには定義されていないメソッドですので、先ほどの「nil:NilClass (NoMethodError)」というエラーメッセージが表示されるということになります。

しかし、変数の初期値はnilですし、プログラム中で変数の値やメソッドの返値がnilになることはよくあることです。

いちいち、変数の値やメソッドの返値がnilになっているかどうかで、「empty?」などの便利なメソッドが使用できずにエラーとなってしまうのは、少々使い勝手が悪いところです。

そこで、Rubyでは、「nilガード」という方法がよくとられます。

「nilガード」については、以降の章を参照してください。

nilの判定

nil?

次にnilの判定について見ていきましょう。

Rubyでnilかどうかを判断するためにはnil?メソッドを使用します。

[実行結果]

このように、nil?メソッドではレシーバーがnilのときtrueを返し、nilではない場合falseを返します。

empty?

nil?とよく似たメソッドに「empty?」があります。

empty?は入れ物は存在するが、値がない状態を指します。

empty?メソッドはnilに使用するとエラーが出てしまうので注意が必要です。

[実行結果]

このように、[]に対してempty?を使用した場合は空の場合はtrueが返ってきますが、nilに対してはNoMethodErrorという例外が走ります。

「NilClassに対してはempty?メソッドは定義されていません」というエラーです。

blank?

blank?nil?empty?を合体させたメソッドです。

さきほどの例ではnilと空の配列[]にempty?メソッドを使用したところ、nilの場合にはエラーとなりましたが、blank?メソッドを使えば、nilでも空でも判定できます。

blank?はRailsで拡張されているメソッドなので、使用する場合は‘active_support’‘active_support/core_ext’をrequireして呼び出してあげる必要があります。

[実行結果]

このように、「nil」なのか「空」なのか気にする必要がないので、とても便利です。

present?

present?blank?とはで、具体的な値があるもの(nilでなく、空でないもの)に対してtrueを返します。

[実行結果]

nilと[]は具体的な値がないので、falseとなりました。

if文の条件式でのnilとfalse

nilは、nil?やblank?でtrueとなりました。

present?ではfalseとなりました。

では、nilをif文の条件式中にそのまま書くと、if文はどのような値として扱うのでしょうか?

答えは、「if文中のnilはfalseとして扱われる」です。

if文中で、falseと同等の値として扱われるのはnilだけです。

falseとnil以外の値、たとえば、0[],””などはtrueとして扱われます。

実際のサンプルコードを見てみましょう。

[実行結果]

実行結果中で、コードの23行目で警告が出ています。

これはif文中で空の文字列””を使用しているので問題ないかどうか念のためRubyが警告してくれています。

それ以降の実行結果では、if文中でfalseとして扱われているのはnilだけで、後の0や、[]、””などはtrueとして扱われていることがわかります。

nilの応用的な使い方

nilガード(nil代入・nilチェック)

上のempty?メソッドでエラーが出たように、nilをレシーバとしてメソッドを使うとエラーが出てしまうことはよくあります。

nilになってしまう状態を防ぐためにnilガードという書き方がrubyには存在します。

nilガードを言葉で説明すると、「もし変数がnilだった場合、値を入れる構文」です。

このように、nilかどうかをチェックし、nilだった場合、nil以外の値を代入するコードのことを、「nilガード」と言います。

nilガードを実装するにはorに使われるパイプ演算子||と=を組み合わせます。

[nilガードの例1]

[実行結果]

[nilガードの例2]

[実行結果]

このように、変数aがnilである時だけ変数が代入されています。

反対に、||=を使った代入方法では、レシーバー(今回はa)がnilやfalse以外の場合には代入は行われません。
(なので23がそのまま返ってきてます)

nilガードのコードをもう少しわかりやすい形にしたコードが、以下のサンプルコードです。

[実行結果]

ここに「a = a || 3」とあるように、「a」に「a || 3」を代入しています。

a || 3」は、「もし、aがnilかfalseだったら、値は3となる」という意味ですので、前述の通り、「a || 3」は値「3」となり、最終的に「a」には「3」が代入される、という結果になります。

このnilガードの構文はよく使用されるので覚えておくようにしましょう。

compactで配列の中のnilを取り除く

配列の中にnilが混ざっている場合はcompactメソッドを使うと一気にnilを取り除けるので便利です。

[実行結果]

このようにすっきりとnil以外の値を使ってarrayを出力できます。

非常に便利なので覚えておきましょう。

まとめ

いかがでしたでしょうか?

この記事では、rubyのnilについて解説しました。

学習のポイントを振り返ってみましょう!

  • nilは変数の中が「何もない」状態を示す値(マーク)
  • NilClassはnilが属しているクラスで、nilはNilClassのインスタンスメソッドとクラスメソッドを持つが、それ以外は持たない。
  • nilの判定には、nil?、empty?、blank?、present?などが使用できる。ただし、empty?だけはnilには使用できない。
  • if文の条件式では、nilはfalseとして扱われる。
  • 変数にnilが入っていた場合のみ代替値を代入する方法として「nilガード」という定形の方法がある。
  • 配列中にたくさんnilが入っている場合、compactメソッドによって、配列中のnilをすべて除去できる。

nilはプログラミング独特の概念のため理解がしにくいところです。

しかしnilを理解することはプログラミングをする上で必須になります。

とにかくnilは「なにもない」のであって、中身だけない「空」の状態とは違うということが理解できていれば最低限は大丈夫です。

また、blank?present?Railsで拡張された機能ですが、rubyでも使えるのでぜひ使用してください。

もしnilについて忘れてしまったらこの記事を確認してくださいね!

Rubyカリキュラム無料公開中!

この記事はRuby入門完全攻略ガイド【基礎学習/アプリ開発/仕事獲得】の一部になります。このカリキュラムは、プログラミング入門者が、基礎学習からアプリ開発、さらには仕事獲得まで体系的に学べる内容となっています。

Ruby学習に必要な情報を一つにまとめていますので効率よくRubyを学ぶことが出来ます。この機会に是非活用していただければと思います。

【Ruby入門ガイド】アプリ開発で知っておくべき知識を総ざらい
更新日 : 2018年11月23日

Rubyを最短で習得したい方へ

近年では様々なWEBサービスが流通するようになりました。

WEBサービスの普及が進むにつれて、それらを素早く開発するのに長けたRubyの人気は今後さらに増し、Rubyエンジニアの需要も自ずと増えることは間違いなしでしょう。

元々ITリテラシーの高い方や他言語を習得している方であれば、独学でRubyを習得することが可能です。

ただし、プログラミング学習をしている方の多くは

「自分に合った教材が見つけられずに挫折してしまった」
「勉強のための勉強になってしまい、ゴールが見えない」
「情報が少なくどう調べればいいかわからない」
「エラーを解決するのに何日もかかってしまう」

このような悩みを抱えたまま挫折してしまうのが現実となっています。

  • もう挫折したくない
  • 本業と両立しながら、好きな時間で自分のペースで勉強を続けていきたい
  • 自分だけのカリキュラムで効率的に勉強したい
  • WEBアプリケーション開発までしっかりサポートして欲しい
そんな方はお気軽に侍エンジニア塾までご相談ください。

お一人お一人に専属のインストラクターがつくので、初心者の方がつまづきがちな、「CookPad」、「Wantedly」、「食べログ」のようなWEBアプリケーション開発方法もスムーズに学習することできます。

実際にオリジナルWEBアプリを開発し、成果物として認められて仕事獲得に成功した塾生は数多くいます。

このように、オリジナルアプリ開発から仕事獲得まで徹底的にサポートすることでプログラミング初心者の方でも安心して基礎学習に取り組むことができます。

まずは『無料体験レッスン』で、弊社のコンサルタントと一緒にあなた専用の学習方法やカリキュラムを考えてみませんか?

Rubyならではの学習方法や、現役フリーランスRubyエンジニアから貴重なアドバイスを受けることができます。

詳しくは下の画像から弊社サービス内容をご確認ください。

ruby_a2

非常識な結果を出す卒業生多数!

エンジニアキャリア戦略

人気記事セレクション

3000名以上来場の人気セミナーが開催決定

18歳で時給6000円だった侍エンジニア塾代表の木内より、『プログラミングで人生を変える』ための学習方法をお教えます。

0からプログラミングを習得し、フリーランスエンジニアになる方法プログラミング学習の効率を劇的に上げる学習メソッドを解説しますので、奮ってご参加ください。

  • 日付:4/20(土),4/27(土)
  • 時間:14:00〜17:35終了予定
  • 場所:当社 道玄坂オフィス
  • 住所:〒150-0043 東京都渋谷区道玄坂2丁目11-1 Gスクエア渋谷道玄坂 4F *Googleマップでは「東京都渋谷区道玄坂2丁目11-1」で検索してください。近隣にスクエア渋谷という別のビルがあるためご留意ください。
  • 参加費:無料
  • URL:https://seminar.sejuku.net/
詳しくは下の画像をクリックして弊社セミナー内容をご確認ください。

LINEで送る
Pocket

この記事が気に入ったら
いいね!をしてフォローしよう

最新情報をお届けします

書いた人

長瀬来

長瀬来

Unityを使ったiOSアプリのリリース、フリマサイト運営の経験があります。

経験した言語はC、C#、Javascript、R、Python、Ruby、PHPなど

言語が好きで、英語や中国、ドイツ語を勉強しました。
将来的には海外で生活したいです。

現在はRuby on Rails5やCocos2dxの勉強を主にしています。

ライターとしては
できるだけ初心者にわかりやすい文章になるように心がけています。

趣味は語学、読書です。