Ruby a une idée universelle de « véracité » et de « fausseté ».
Ruby n'ont deux classes spécifiques pour les objets Boolean, et , avec les instances singleton désignés par les variables spéciales et , respectivement.TrueClass
FalseClass
true
false
Cependant, la véracité et la fausseté ne sont pas limitées aux instances de ces deux classes, le concept est universel et s'applique à chaque objet unique dans Ruby. Chaque objet est soit vrai soit faux . Les règles sont très simples. En particulier, seuls deux objets sont faux :
nil
, l'instance singleton deNilClass
etfalse
, l'instance singleton deFalseClass
Chaque autre objet est véridique . Cela inclut même les objets qui sont considérés comme faux dans d'autres langages de programmation, tels que
Ces règles sont intégrées dans la langue et ne sont pas définissables par l'utilisateur. Il n'y a pas de to_bool
conversion implicite ou quelque chose de similaire.
Voici une citation de la spécification ISO Ruby Language :
6.6 Valeurs booléennes
Un objet est classé en un objet vrai ou un objet faux .
Seuls faux et nil sont des objets faux. false est la seule instance de la classe
FalseClass
(voir 15.2.6) à laquelle une fausse expression est évaluée (voir 11.5.4.8.3). nil est la seule instance de la classeNilClass
(voir 15.2.4) à laquelle une expression nil est évaluée (voir 11.5.4.8.2).Les objets autres que faux et nul sont classés en objets vrais. true est la seule instance de la classe
TrueClass
(voir 15.2.5) à laquelle une expression vraie est évaluée (voir 11.5.4.8.3).
L'exécutable Ruby / Spec semble d'accord :
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
Selon ces deux sources, je suppose que les Regexp
s sont également véridiques , mais selon mes tests, ils ne le sont pas:
if // then 'Regexps are truthy' else 'Regexps are falsy' end
#=> 'Regexps are falsy'
J'ai testé cela sur YARV 2.7.0-preview1 , TruffleRuby 19.2.0.1 et JRuby 9.2.8.0 . Les trois implémentations sont en accord et en désaccord avec la spécification ISO Ruby Language et mon interprétation de Ruby / Spec.
Plus précisément, les Regexp
objets qui sont le résultat de l'évaluation des Regexp
littéraux sont faux , alors que les Regexp
objets qui sont le résultat d'une autre expression sont véridiques :
r = //
if r then 'Regexps are truthy' else 'Regexps are falsy' end
#=> 'Regexps are truthy'
Est-ce un bug ou un comportement souhaité?
!!//
est faux mais !!/r/
vrai. Étrange en effet.
!!/r/
produit false
pour moi en utilisant (RVM) Ruby 2.4.1.
//
dans if // then
est interprété comme un test (un raccourci pour if //=~nil then
) (qui est toujours faux quel que soit le motif) et non comme une instance Regexp.
Regex.new("a")
est intéressant, c'est que c'est vrai.