論理型の扱いについてどのプログラミング言語でも多少の違いがある。どの値が「真」でどの値が「偽」かを理解しておくことは、その言語を扱う上ではとても重要である。ここではRubyにおける「真」「偽」について整理する。
Rubyにおいて何が「真」で何が「偽」かは、ありがたいことに非常に単純なルールで表現できる。
falseとnilを除く全ての値が「真」
1 2 3 4 5 |
irb(main):043:0> x = 0 irb(main):044:0> if x irb(main):045:1> puts 'xは真です' irb(main):046:1> end xは真です |
1 2 3 4 5 |
irb(main):043:0> x = 0 irb(main):044:0> if x irb(main):045:1> puts 'xは真です' irb(main):046:1> end xは真です |
他の言語では0は「偽」として扱われる事が多いがRubyでは「真」
1 2 3 4 5 |
irb(main):043:0> y = nil irb(main):044:0> unless y irb(main):045:1> puts 'yは偽です' irb(main):046:1> end yは偽です |
2つの値で偽を表し、その他の値を真で表すというルールは時々邪魔になることがある。例えばfalseとnilを区別しないといけない場合である。そういう場合はObject#nil?メソッドまたはFalseClass#==メソッドを使うと良い。
nilか判定したい
1 2 3 |
if x.nil? # xがnilの場合の処理 end |
falseか判定したい
1 2 3 |
if false == x # xがfalseのときの処理 end |
ここで注意だが、falseを左に置いているのには理由がある。
if x == false のように右側にfalseを置いてしまうと、時として期待通りの動作をしない可能性がある。
以下のような場合だ。
Badクラスを定義
1 2 3 4 5 |
class Bad def == (ohter) true end end |
1 2 |
irb(main):019:0* false == Bad.new => false |
falseが返ると期待するも結果はtrue
1 2 |
irb(main):026:0> Bad.new == false => true |
まとめ
・falseとnilを除く全ての値が「真」
・nilかどうかを判定するときはObject#nil?を使う
・falseかどうかを判定するときはFalseClass#==を使う