Rubyには「真実性」と「虚偽性」という普遍的な考え方があります。
Rubyには、ブールオブジェクト用に2つの特定のクラスがTrueClass
ありFalseClass
、シングルトンインスタンスはそれぞれ特殊変数true
とfalse
で示されます。
ただし、真実性と偽造性はこれら2つのクラスのインスタンスに限定されず、概念は普遍的であり、Rubyのすべてのオブジェクトに適用されます。すべてのオブジェクトは真実か偽物です。ルールは非常に簡単です。特に、2つのオブジェクトだけが偽物です:
nil
シングルトンインスタンスNilClass
とfalse
、のシングルトンインスタンスFalseClass
他のすべてのオブジェクトは真実です。これには、他のプログラミング言語で偽物と見なされるオブジェクトも含まれます。
これらのルールは言語に組み込まれており、ユーザーが定義することはできません。to_bool
暗黙的な変換やそれに類似したものはありません。
ISO Ruby言語仕様からの引用は次のとおりです。
6.6ブール値
オブジェクトは、真実のオブジェクトまたは偽のオブジェクトに分類されます。
falseとnilのみが偽りのオブジェクトです。falseは、false式が評価されるクラスのインスタンス
FalseClass
(15.2.6を参照)のみです(11.5.4.8.3を参照)。nilは、クラスの唯一のインスタンス(15.2.4を参照)であり、nil式が評価されます(11.5.4.8.2を参照)。NilClass
falseおよびnil以外のオブジェクトは、trueishオブジェクトに分類されます。trueは、true式が評価されるクラスの唯一のインスタンス
TrueClass
(15.2.5を参照)です(11.5.4.8.3を参照)。
it "considers a non-nil and non-boolean object in expression result as true" do if mock('x') 123 else 456 end.should == 123 end
これらの2つの情報源によると、私はRegexp
sも真実であると想定していますが、私のテストによると、そうではありません。
if // then 'Regexps are truthy' else 'Regexps are falsy' end
#=> 'Regexps are falsy'
YARV 2.7.0-preview1、TruffleRuby 19.2.0.1、およびJRuby 9.2.8.0でこれをテストしました。3つの実装すべてが互いに同意し、ISO Ruby言語仕様とRuby / Specの私の解釈に同意しません。
より正確にRegexp
は、Regexp
リテラルの評価の結果であるオブジェクトは偽物Regexp
ですが、他のいくつかの式の結果であるオブジェクトは真実です。
r = //
if r then 'Regexps are truthy' else 'Regexps are falsy' end
#=> 'Regexps are truthy'
これはバグですか、それとも望ましい動作ですか?
!!//
は偽です!!/r/
が、真です。確かに奇妙です。
!!/r/
はfalse
(RVM)Ruby 2.4.1を使用して生成します。
//
in if // then
はif //=~nil then
Regexpインスタンスではなく、テスト(のショートカット)(パターンに関係なく常に偽物)として解釈されると思います。
Regex.new("a")
が真実であることです。