simanのブログ

ゆるふわプログラマー。競技プログラミングやってます。Ruby好き

rubyのnilとtrueとfalse

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の判定は異なっているので、この辺りを色々考察してみるのも面白いかもしれない。