【Ruby】真 (true) とは何か

1 min読了の目安(約1200字TECH技術記事

最近技術書を読んでいて、わかった気になってるなーと思い、
細かいことでも頻繁にアウトプットしていくことにしました。

未来の自分のための記事です。

※検証Rubyバージョン: 2.7.2

結論

Rubyではfalsenil以外のすべての値が真です。

TrueとFalse

Rubyにおいて、すべてのデータ・値は何らかのクラスに属するオブジェクトです。
もちろんtrueやfalseも例外ではありません。

irb> true.class
=> TrueClass
irb> false.class
=> FalseClass

irb> true.class.ancestors
=> [TrueClass, Object, Kernel, BasicObject]
irb> false.class.ancestors
=> [FalseClass, Object, Kernel, BasicObject]

falseとnil以外が真であるなら、0 (空文字)も真です。

# 「0」は true
irb> p 0 ? true : false
true
=> true

# 「 」もtrue
irb> p '' ? true : false
(irb):15: warning: string literal in condition
true
=> true

しかし他の言語では「0」は偽であることが多く、JavaScriptでは0や空文字はfalsyです。

nilとfalse

nilとfalseを区別するにはnil?メソッドがあります。

irb> a = nil
=> nil
irb> a.nil?
=> true
irb> b = false
=> false
irb> b.nil?
=> false

Rubyのプログラムを書いていると予想外にnilが混入することがあるので、nilチェックをよくしますが、
nilオブジェクトは型変換をしてあげるとnil回避ができます。

irb> nil.to_s
=> ""
irb> nil.to_i
=> 0
irb> nil.to_a
=> []
irb> nil.to_h
=> {}
irb> nil.to_sym
NoMethodError (undefined method `to_sym' for nil:NilClass)

to_symはだめっぽい。

追記

Rubyにおける真/偽とtrue/falseを混同していたのですが、下記記事がとても参考になりました。
Ruby の真/偽と true/false は違う