Rubyのプログラムでempty?メソッドを正しく使うには、Rubyの変数が空の場合とnilの場合とで扱い方が違うことを理解しなければなりません。では、その違いとは何でしょうか。今回は、empty?の機能と使い方を、変数が空の場合とnilの場合の扱いを含めて解説します。
オブジェクトが空白な状態をチェックする
Rubyに限らず、変数にデータが格納されていない場合、別の処理に切り替えたいケースがよくあります。そしてRubyでオブジェクトが空白かどうかをチェックするメソッドはempty?です。では、オブジェクトが空白とはどのような状態でしょうか。
empty?メソッドを解説する前にオブジェクトが空白な状態について説明します。
配列やハッシュの要素が無い
今回解説するempty?メソッドは配列またはハッシュをチェックし、要素が1つも無い状態の場合にtrueを返します。配列(Array)は複数の要素を1つの変数で扱える便利な機能ですが、要素が全く無い配列を作ることも可能です。例えば、次の例を見てください。
arr = [] p arr # []が出力される
上記は、配列を格納する変数arrのみ作成しそのまま表示した例です。ハッシュでも同じように作れます。
hash = {} p hash # {}が表示される
空の文字列
empty?メソッドは文字列に対しても使えます。なお、配列は配列クラス、ハッシュはハッシュクラスと別れていてそれぞれでempty?が定義されており、文字列クラスで使えるempty?はそれらと全く別物です。
そして、先ほどの配列やハッシュと同じように、文字列をチェックして文字が1つも無い場合にtrueを返します。
strs = "" p strs # ""が表示される p strs.empty? # trueが表示される
なお文字列にスペースが1文字格納された状態も空白のように見えますが、これは空ではありません。
strs = " " p strs # " "が表示される p strs.empty? # falseが表示される
空とnilの違い
Rubyでは、変数に何も格納されていない状態で参照するとnilが使われます。そして、先ほど説明した配列などが空な状態と、変数にnilが格納された状態は別です。
例えば下記のように変数valにnilを代入した時点では、その変数の値はnilです。この状態はまだ文字列ではなくnilを扱うクラスの変数で、nilを扱うクラスにempty?メソッドはありません。そのため、empty?メソッドでチェックするとエラーが発生します。
続いて、””を代入したことで文字列になり、文字列クラスに定義されたempty?メソッドが使えます。
val = nil p val # nilが表示される p val.empty? # エラーになる val = "" p val # ""が表示される p val.empty? # trueが表示される
empty?メソッドの基本
先ほど説明したようにempty?メソッドはRubyにおける配列やハッシュ、文字列が空な状態かをチェックするメソッドです。次からこのempty?メソッドの文法や使い方について解説します。
empty?メソッドの文法
empy?メソッドは、Rubyの配列(Array)クラス、ハッシュ(Hash)クラス、文字列(String)クラスに定義されたメソッドです。そのためそれぞれの変数に対して使用します。そして、empy?メソッドの文法は次のとおりで空の場合にtrueを、そうでない場合にfalseを返します。
配列.empty?
ハッシュ.empty?
文字列.empty?
empty?はif構文で使う
先ほどempyu?メソッドはtrueまたはfalseを返すと説明しましたが、empty?単体で使われることはありません。大抵はif構文の中で使われます。
配列が空かをチェックする例
arr = [] if arr.empty? then p "配列は空です" end
また、3項演算子を使い次のようなプログラムも書けます。
arr = [] message = arr.empty? ? "配列は空です" : "配列は空ではありません" p message # "配列は空です"が表示される
文字列でempty?を使う場合の注意点
Rubyのプログラムで使う全ての変数は、格納するデータのクラスに定義されたメソッドを使用できます。つまり、文字列(String)クラスのempty?メソッドを使うには、変数に文字列が格納されていなければなりません。
もし、変数に0などの数字が代入された場合、0を扱う整数(Integer)クラスにはempty?メソッドが定義されていません。そのため、エラーになるので変数の扱いに注意してください。
num = 0 if num.empty? then p "numは空です" end
この例の変数numには0が格納されているため、整数(Integer)クラスとなり、empty?メソッドは使えない、というエラーメッセージが表示され処理が中断します。
empty?メソッドと同じようなメソッド
Rubyにはempty?メソッドと同じ機能のメソッドが他にもあります。さらにRuby on Railsを利用すれば、もっと便利なメソッドも利用可能です。
次からそのようなメソッドをempty?メソッドと比較しながら解説します。
nil?
先ほど説明したようにRubyにおけるnilとは変数が初期化され、まだデータが入っていない状態です。そしてその変数がどのクラスで処理するか決まっていません。そのような状態を表すnilは特別なクラスとして扱われます。
そしてnilの状態の変数をチェックする専用のメソッドがnil?です。
nil?を使った例
val = nil if val.nil? then p "変数valの値はnilです" end
今回説明しているempty>メソッドは、配列クラス、ハッシュクラス、文字列クラスで定義されたメソッドです。もし、nil?でチェックしてtrueとなる変数は、まだどのクラスでもありません。そのためnil?でtrueとなる変数ではempty?メソッドが使えないので注意してください。
Ruby on Railsのblank?
もし、先ほど説明したnil?とempty?を1つのメソッドでチェックできれば便利だと思いませんか。そのようなメソッドをRuby on Railsで利用できます。そしてそれがblank?メソッドです。
blank?の使い方使い方は、empty?メソッドやnil?メソッドと同じで変数が、空文字、空白文字、false、nilの場合にtrueを返し、それ以外はfalseを返すます。
blank?メソッドの例
val = nil if val.blank? then p "変数valの値は空です" end
なお、blank?はRuby on Railsに含まれるactive_supportライブラリを使えば、Ruby on Railsの外でも利用できます。active_supportは簡単に設定できるので、興味のある方は使ってみてください。
active_supportを使いblank?を利用する例
reqruie 'active_support/all' val = nil if val.blank? then p "変数valの値は空です" end
Ruby on Railsのpresent?
先ほど紹介したblank?は便利ですが、空またはnilの状態よりも変数に値が入っている状態を処理するケースの方が多いのではないでしょうか。そのようなチェックに便利なメソッドがちょうどblank?の逆に当たるpresent?メソッドです。
なお、present?メソッドもRuby on Railsに含まれているので、Ruby on Rails以外で利用する場合はactive_supportを利用してください。そしてpresent?メソッドは、変数に値が入っていればtrueを、そうでなければfalseを返すメソッドです。
present?を使った例
reqruie 'active_support/all' val = 'OK' if val.present? then p "変数valには値が入っています" end
まとめ
これまで説明したようにRubyのempty?メソッドは、配列、ハッシュ、文字列の変数で、中身が無い空の状態の場合にtrueを返すメソッドです。そのためif構文に組み合わせて変数が空かどうかをチェックし、空の場合に処理するケースなどに使用します。
Rubyでは配列やハッシュがよく利用されるので、それらをチェックできるempty?の使い方をぜひマスターしてください。