rubyでは真を表す表現として「true」が、偽を表す表現として「nil」と「false」が定義されています。Rubyでは「全てがオブジェクト」なので、実はこのtrue,nil,falseにはクラスが存在します。
・TrueClass
trueのクラスです、つまりTrueClassのインスタンスがtrueとなります。
p true.class p true.to_s
TrueClass "true"
to_sメソッドで"true"という文字列を返す。to_iやto_aなども調べてみたが、どうやら定義されていいないらしい。
・FalseClass
falseのクラス、falseはFalseClassのインスタンスです。
p false.class p false.to_s
FalseClass "false"
to_sメソッドで"false"文字列を返します。to_iやto_aなどは定義されていませんでした。
false?とtrue?メソッド
nil?メソッドはあるのにtrue?とfalse?メソッドがなかったので追加してみた。
class Object def true? (self && true).!.! end def false? !(self || false) end end puts "----------------------------------" puts "true.true? => #{true.true?}" puts "false.true? => #{false.true?}" puts "nil.true? => #{nil.true?}" puts "3.true? => #{3.true?}" puts "'true'.true? => #{'true'.true?}" puts "[].true? => #{[].true?}" puts "----------------------------------" puts "true.false? => #{true.false?}" puts "false.false? => #{false.false?}" puts "nil.false? => #{nil.false?}" puts "3.false? => #{3.false?}" puts "'false'.false? => #{'false'.false?}" puts "[].false? => #{[].false?}" puts "----------------------------------"
---------------------------------- true.true? => true false.true? => false nil.true? => false 3.true? => true 'true'.true? => true [].true? => true ---------------------------------- true.false? => false false.false? => true nil.false? => true 3.false? => false 'false'.false? => false [].false? => false ----------------------------------
最初trueメソッドの方は「self AND true」で実装していたのですが、nil.true?のときにnilを返してしまうので、「!」メソッドを2回使用することでfalseを出力させるようにしました。(nil -> true -> false)
NilClass
nilはNilクラスのインスタンス。
p nil.class p nil.to_s p nil.to_i p nil.to_f p nil.to_a
NilClass "" 0 0.0 []
nilだけなぜかto_aやto_iメソッドが実装されている。わけがわからないよ。
nilとはいったい
nilをキャストした値とtrueでANDを取ると全てtrueを返す
p nil && true p nil.to_i && true p nil.to_f && true p nil.to_s && true p nil.to_a && true
nil true true true true
nilとはいったい何だろう。難しい。実際、言語ごとにtrue,falseの判定は異なっているので、この辺りを色々考察してみるのも面白いかもしれない。