Parece que no puedo verificar si un objeto es booleano fácilmente. ¿Hay algo así en Ruby?
true.is_a?(Boolean)
false.is_a?(Boolean)
En este momento estoy haciendo esto y me gustaría acortarlo:
some_var = rand(1) == 1 ? true : false
(some_var.is_a?(TrueClass) || some_var.is_a?(FalseClass))
ruby
typechecking
Lance Pollard
fuente
fuente
Respuestas:
La forma más simple en que puedo pensar:
fuente
Encuentro que esto es conciso y autodocumentado:
Si usa Rails o ActiveSupport, incluso puede hacer una consulta directa usando
in?
Verificar todos los valores posibles no es algo que recomendaría para flotadores, ¡pero es factible cuando solo hay dos valores posibles!
fuente
foo == true or foo == false
que alguien haya hecho un comentario.!!foo == foo
.No hay ninguna
Boolean
clase en Ruby, la única manera de comprobar es hacer lo que está haciendo (comparando el objeto contratrue
yfalse
ni la clase del objeto contraTrueClass
yFalseClass
). Sin embargo, no puedo pensar por qué necesitarías esta funcionalidad, ¿puedes explicarlo? :)Sin embargo, si realmente necesita esta funcionalidad, puede hackearla en:
fuente
expect(some_method?(data)).to be_a(Boolean)
"quotes"
Como se indicó anteriormente, no hay una clase booleana solo TrueClass y FalseClass, sin embargo, puede usar cualquier objeto como sujeto de if / less y todo es verdadero, excepto instancias de FalseClass y nil
Las pruebas booleanas devuelven una instancia de FalseClass o TrueClass
El siguiente monkeypatch to Object le dirá si algo es una instancia de TrueClass o FalseClass
Ejecutar algunas pruebas con irb da los siguientes resultados
fuente
self == true or self == false
. Esas son las únicas instancias de TrueClass y FalseClass.boolean
, una para TrueClass / FalseClass y otra para Object.Time#==
Ruby 1.8 hace que una comparación con valores que no son de tiempo devuelva nil en lugar de falso.Si su código se puede escribir sensatamente como una declaración de caso, esto es bastante decente:
fuente
Un objeto que es un booleano tendrá una clase de TrueClass o FalseClass, por lo que el siguiente trazo debería hacer el truco
Lo siguiente también le daría un resultado de verificación de tipo booleano verdadero / falso
fuente
Pruebe esta
(x == true) ^ (x == false)
nota, necesita el paréntesis, pero es más hermoso y compacto.Incluso pasa el sugerido como "cuak" pero no un "cuak" ...
class X; def !; self end end ; x = X.new; (x == true) ^ (x == false)
Nota : vea que esto es tan básico que también puede usarlo en otros idiomas, que no proporciona una "cosa booleana".
Nota 2 : También puede usar esto para decir que la cosa es una de ??:
"red", "green", "blue"
si ustedadd more XORS
... o decir que esta cosa es una de ??:4, 5, 8, 35
.fuente
Esta gema agrega una clase booleana a Ruby con métodos útiles.
https://github.com/RISCfuture/boolean
Utilizar:
Entonces tu
funcionará exactamente como esperabas.
fuente
No. No como si tuvieras tu código. No hay ninguna clase llamada booleana. Ahora, con todas las respuestas que tiene, debería poder crear una y usarla. ¿Sabes cómo crear clases, no? Solo vine aquí porque me preguntaba esta idea. Mucha gente podría decir "¿Por qué? Tienes que saber cómo Ruby usa el booleano". Por eso obtuviste las respuestas que obtuviste. Así que gracias por la pregunta. Comida para el pensamiento. ¿Por qué Ruby no tiene una clase booleana?
Tenga en cuenta que los objetos no tienen tipos. Son clases Los objetos tienen datos. Por eso, cuando dice tipos de datos, es un nombre poco apropiado.
También intente rand 2 porque rand 1 parece siempre dar 0. rand 2 dará 1 o 0 clic en ejecutar algunas veces aquí. https://repl.it/IOPx/7
Aunque no sabría cómo hacer una clase booleana yo mismo. He experimentado con eso pero ...
Al menos tenemos esa clase ahora, pero ¿quién sabe cómo obtener los valores correctos?
fuente