Ruby hat eine universelle Vorstellung von " Wahrhaftigkeit " und " Falschheit ".
Ruby hat zwei Klassen spezifische haben für Boolesche Objekte, TrueClass
und FalseClass
mit Instanzen Singleton durch die speziellen Variablen bezeichnet true
und false
sind.
Allerdings Truthiness und falsiness sind nicht auf Instanzen dieser beiden Klassen beschränkt, ist das Konzept universell und gilt für jedes einzelne Objekt in Ruby. Jedes Objekt ist entweder wahr oder falsch . Die Regeln sind sehr einfach. Insbesondere sind nur zwei Objekte falsch :
nil
, die Singleton-Instanz vonNilClass
undfalse
, die Singleton-Instanz vonFalseClass
Jedes andere Objekt ist wahr . Dies schließt auch Objekte ein, die in anderen Programmiersprachen als falsch gelten , wie z
Diese Regeln sind in die Sprache integriert und nicht benutzerdefinierbar. Es gibt keine to_bool
implizite Konvertierung oder ähnliches.
Hier ist ein Zitat aus der ISO Ruby-Sprachspezifikation :
6.6 Boolesche Werte
Ein Objekt wird entweder als wahres Objekt oder als falsches Objekt klassifiziert .
Nur falsch und null sind falsche Objekte. false ist die einzige Instanz der Klasse
FalseClass
(siehe 15.2.6), für die ein falscher Ausdruck ausgewertet wird (siehe 11.5.4.8.3). nil ist die einzige Instanz der KlasseNilClass
(siehe 15.2.4), für die ein nil-Ausdruck ausgewertet wird (siehe 11.5.4.8.2).Andere Objekte als false und nil werden in trueish-Objekte eingeteilt. true ist die einzige Instanz der Klasse
TrueClass
(siehe 15.2.5), für die ein true-Ausdruck ausgewertet wird (siehe 11.5.4.8.3).
Die ausführbare Datei Ruby / Spec scheint zuzustimmen :
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
Nach diesen beiden Quellen würde ich annehmen, dass Regexp
s auch wahr sind , aber nach meinen Tests sind sie nicht:
if // then 'Regexps are truthy' else 'Regexps are falsy' end
#=> 'Regexps are falsy'
Ich habe dies auf YARV 2.7.0-Preview1 , TruffleRuby 19.2.0.1 und JRuby 9.2.8.0 getestet . Alle drei Implementierungen stimmen überein und stimmen nicht mit der ISO Ruby-Sprachspezifikation und meiner Interpretation der Ruby / Spec überein.
Etwas präziser, Regexp
Objekte, die das Ergebnis der Bewertung von Regexp
Literalen sind, falsch , während Regexp
Objekte, die das Ergebnis eines anderen Ausdrucks sind, wahr sind :
r = //
if r then 'Regexps are truthy' else 'Regexps are falsy' end
#=> 'Regexps are truthy'
Ist das ein Fehler oder ein gewünschtes Verhalten?
!!//
ist falsch, aber !!/r/
wahr. Tatsächlich seltsam.
!!/r/
produziert false
für mich mit (RVM) Ruby 2.4.1.
//
in if // then
als Test (eine Abkürzung für if //=~nil then
) interpretiert wird (das ist unabhängig vom Muster immer falsch) und nicht als Regexp-Instanz.
Regex.new("a")
das wahr ist.