Ruby tiene una idea universal de " veracidad " y " falsedad ".
Rubí hace tener dos clases específicas de objetos de tipo booleano, TrueClass
y FalseClass
, con instancias singleton denotados por las variables especiales true
y false
, respectivamente.
Sin embargo, la veracidad y la falsedad no se limitan a las instancias de esas dos clases, el concepto es universal y se aplica a todos los objetos en Ruby. Todo objeto es verdadero o falso . Las reglas son muy simples. En particular, solo dos objetos son falsos :
nil
, la instancia singleton deNilClass
yfalse
, la instancia singleton deFalseClass
Todo otro objeto es verdadero . Esto incluye incluso objetos que se consideran falsos en otros lenguajes de programación, como
Estas reglas están integradas en el lenguaje y no son definibles por el usuario. No hay to_bool
conversión implícita ni nada similar.
Aquí hay una cita de la especificación ISO Ruby Language :
6.6 Valores booleanos
Un objeto se clasifica en un objeto verdadero o un objeto falso .
Solo falso y nulo son objetos falsos. falso es la única instancia de la clase
FalseClass
(ver 15.2.6), a la que se evalúa una expresión falsa (ver 11.5.4.8.3). nil es la única instancia de la claseNilClass
(ver 15.2.4), a la que se evalúa una expresión nil (ver 11.5.4.8.2).Los objetos distintos de falso y nulo se clasifican en objetos verdaderos. verdadero es la única instancia de la clase
TrueClass
(ver 15.2.5), a la que se evalúa una expresión verdadera (ver 11.5.4.8.3).
El ejecutable Ruby / Spec parece estar de acuerdo :
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
Según esas dos fuentes, supongo que los Regexp
s también son verdaderos , pero según mis pruebas, no lo son:
if // then 'Regexps are truthy' else 'Regexps are falsy' end
#=> 'Regexps are falsy'
Probé esto en YARV 2.7.0-preview1 , TruffleRuby 19.2.0.1 y JRuby 9.2.8.0 . Las tres implementaciones están de acuerdo entre sí y no están de acuerdo con la especificación ISO Ruby Language y mi interpretación de Ruby / Spec.
Más precisamente, los Regexp
objetos que son el resultado de evaluar Regexp
literales son falsos , mientras Regexp
que los objetos que son el resultado de alguna otra expresión son verdaderos :
r = //
if r then 'Regexps are truthy' else 'Regexps are falsy' end
#=> 'Regexps are truthy'
¿Es esto un error o un comportamiento deseado?
!!//
es falso pero !!/r/
es cierto Extraño de hecho.
!!/r/
produce false
para mí usando (RVM) Ruby 2.4.1.
//
en el if // then
se interpreta como una prueba (un acceso directo para if //=~nil then
) (que es siempre Falsy cualquiera que sea el patrón) y no como una instancia Regexp.
Regex.new("a")
es verdad.