Rubyで変数が空かどうかを調べる際、Ruby on Railsのpresent?メソッドとblank?メソッドを利用できるのをご存じでしょうか。
Rubyでは、変数に値が入ってからStringクラスやNumberクラスに変わるので、値が入る前にチェックしようとするとエラーになります。その点、Ruby on Railsのpresent?メソッドとblank?メソッドなら、値が入る前でもチェックが可能です。
今回は、Rubyの変数の特徴と空かどうかを調べるpresent?メソッドおよびblank?メソッドの使い方について解説します。
RubyでNULLを判定するには
Rubyでは変数に値が格納されていない場合、処理によって誤動作する場合があります。そのため、事前に変数の値が格納されているかをチェックする、いわゆるNULL判定を実施し、処理を分岐させなければなりません。
しかし、RubyではNULL判定が簡単ではありません。次からRubyのNULL判定方法について紹介します。
変数が空という状態とは
Rubyのプログラムで扱う変数やメソッドは全て何らかのクラスに属しています。ただし変数は、格納されたデータによってどのクラスに所属する決まるのがRubyの仕様です。
具体的には変数に文字列を格納するとStringクラスになり、数字を格納するとNumberクラスになる、といった具合です。
では変数が空というのは、どのような状態でしょうか。値を何も格納していない変数は、どのクラスにも所属しておらず、スーパークラスに属しています。そのためStinrgクラスのメソッドではチェックできません。
一方、変数に”を代入するとStringクラスになり、Stinrgクラスのメソッドで空かどうかをチェックできます。このようにRubyでは変数の状態によってチェックするメソッドを変えなければなりません。
Rubyのnil?でチェック
変数を作ったばかりの変数は、スーパークラスという特別のクラスに属しています。これをチェックするには、スーパークラスのメソッドを使用します。
スーパークラスの変数をチェックするメソッドはnil?メソッドです。nil?は変数がnilかどうか、つまり空かどうかをチェックします。
一方、文字列の”を代入するとStringクラスに変わりますが、Stirngクラスの変数が空かどうかをチェックするメソッドがrmpty?です。
今回紹介するRuby on Railsのpresent?メソッドは、nil?メソッドとrmpty?メソッドの2つのチェックを一度にできる便利なメソッドです。
Ruby on Railsのpresent?メソッド
今回紹介するpresentメソッドはRub on Railsに含まれるactive_supportライブラリに含まれるメソッドです。そのため、active_supportライブラリが使えれば、Ruby on RailsでなくてもRubyのプログラムから利用できます。
次からpresentメソッドの利用方法について紹介します。
Ruby on Railsをダウンロードする
presentメソッドは、Rub on Railsに含まれるactive_supportライブラリに含まれています。もし、Ruby on Railsをダウンロードしていない場合は、gemコマンドを利用してダウンロードしてください、また、Ruby on Railsを利用してプログラムを作成する場合は、そのまま使用できます。
Ruby on Railsをダウンロードするコマンド
gem install rails
active_supportライブラリを読み込む
Ruby on Railsは多くのライブラリで構成されていますが、presentメソッドが定義されているactive_supportライブラリもその1つです。そしてactive_supportライブラリは単体でも利用できるので、もし使用する場合はrequireメソッドで読み込んだください。
active_supportライブラリ読み込み方法
require 'active_support/all'
present?メソッドの使い方
present?メソッドは、変数が次の状態の場合にfalseを、そうでない場合にtrueを返します。
- nilとfalse
- 空白のみで構成された文字列
- 空の配列とハッシュ
- その他empty?の応答に、emptyを返すオブジェクト
present?メソッドの例
require 'active_support/all' val = "" if val.present? p "変数valに値が格納されています" else p "変数valに値が格納されていません" end
上記の例は、valが「空白のみで構成された文字列」なので、「”変数valに値が格納されていません”」が表示されます。
Ruby on Railsのblank?メソッド
先ほど紹介したpresent?メソッドは、変数にデータが入っている場合にtrueを返すメソッドでしたが、その逆をチェックするのがblank?メソッドです。
次からblank?メソッドの使い方を紹介します。
blank?もRailsのメソッド
先ほど紹介したpresent?メソッドと同じように、blank?メソッドもRuby on Railsに含まれるactive_supportライブラリを読み込むことで使えます。
Ruby on Rails以外のRubyのプログラムでblnak?メソッドを使う場合も、最初にactive_supportライブラリを読み込んでください。
blank?メソッドの使い方
blank?メソッドは、present?メソッドの逆の機能のため、変数が次の状態の場合にtrueを、そうでない場合にfalseを返します。
- nilとfalse
- 空白のみで構成された文字列
- 空の配列とハッシュ
- その他empty?の応答に、emptyを返すオブジェクト
blank?メソッドの例
require 'active_support/all' val = "" if val.blank? p "変数valに値が格納されています" else p "変数valに値が格納されていません" end
上記の例は、valが「空白のみで構成された文字列」なので、present?メソッドとは逆の「”変数valに値が格納されています”」が表示されます。
present?メソッドの応用例
先ほど、present?の使用例としてif構文の例を紹介しましたが、tureとfalseを使った別の使い方も可能です。次にpresent?メソッドを使った応用例を紹介します。
if修飾子で使う
Rubyでは処理の後ろにif修飾子を記述することで、条件式がtureのケースでのみ、その処理を実行できます。if構文でelseが不要な場合に限定されますが、Rubyらしい1行で簡潔に書ける方法です
このif修飾子の条件式にpresent?メソッドを使用できます。
if修飾子の書き方
処理 if 条件式
if修飾子でpresent?メソッドを使った例
require 'active_support/all' val = 'state' val = '' if arr.present? p arr # valは空なので「""」が表示されます
これはif修飾子を用い、valに文字列が格納されていたらvalの値を空にする例です。
上記の例をif文で書き直すと下記のようになります。
require 'active_support/all' val = 'state' if val.present? then val = '' end p arr # valは空なので「""」が表示されます
三項演算子で使う
三項演算子とは、下記のようにif文を使わずに条件式に応じて演算式を切り替えられる処理を1行で書ける便利な機能です。そして三項演算子の条件式にpresent?メソッドを使用できます。
三項演算子の書き方
条件式 ? trueの場合の演算式 : falseの場合の演算式
三項演算子にpresent?メソッドを使った例
require 'active_support/all' val = '' message = val.present? ? "変数に値が可能されてます" : "変数は空です" p val
この例では、変数valが空なので、val.present?はfalseとなるので、「’変数は空です’」が表示される。
上の例は下記のように書くことが可能です。
require 'active_support/all' val = '' if val.present? then message = "変数に値が可能されてます" else message = "変数は空です" end p message
まとめ
これまで解説したようにRubyで変数が空かどうかをチェックするには、Ruby on Railsのpresent?メソッド、またはblank?メソッドを使うと便利です。そしてactive_supportライブラリを利用することで、Ruby on Rails以外のRubyのプログラムでも利用できます。
また、tureとfalseを返すpresent?メソッドは、if構文はもちろん、if修飾子や三項演算子でも使えるので、ぜひ利用してください。