🔖
【Ruby】真 (true) とは何か
最近技術書を読んでいて、わかった気になってるなーと思い、
細かいことでも頻繁にアウトプットしていくことにしました。
未来の自分のための記事です。
※検証Rubyバージョン: 2.7.2
結論
Rubyではfalse
とnil
以外のすべての値が真です。
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 は違う
Discussion