Não consigo verificar se um objeto é um booleano facilmente. Existe algo assim em Ruby?
true.is_a?(Boolean)
false.is_a?(Boolean)
No momento, estou fazendo isso e gostaria de reduzi-lo:
some_var = rand(1) == 1 ? true : false
(some_var.is_a?(TrueClass) || some_var.is_a?(FalseClass))
ruby
typechecking
Lance Pollard
fonte
fonte
Respostas:
A maneira mais simples de pensar:
fonte
Acho isso conciso e auto-documentado:
Se estiver usando o Rails ou o ActiveSupport, você pode até fazer uma consulta direta usando
in?
Verificar todos os valores possíveis não é algo que eu recomendaria para carros alegóricos, mas é possível quando existem apenas dois valores possíveis!
fonte
foo == true or foo == false
que alguém fizesse um comentário.!!foo == foo
.Não há
Boolean
classe no Ruby, a única maneira de verificar é fazer o que você está fazendo (comparando o objeto contratrue
e /false
ou a classe do objeto contraTrueClass
eFalseClass
). Mas não consegue pensar por que você precisaria dessa funcionalidade, pode explicar? :)Se você realmente precisar dessa funcionalidade, poderá invadir:
fonte
expect(some_method?(data)).to be_a(Boolean)
"quotes"
mas não números e booleanosComo mencionado acima, não há classe booleana apenas TrueClass e FalseClass, no entanto, você pode usar qualquer objeto como assunto de if / a menos e tudo é verdadeiro, exceto instâncias de FalseClass e nulo
Testes booleanos retornam uma instância do FalseClass ou TrueClass
O seguinte monkeypatch para Object informará se algo é uma instância de TrueClass ou FalseClass
A execução de alguns testes com o irb fornece os seguintes resultados
fonte
self == true or self == false
. Essas são as únicas instâncias de TrueClass e FalseClass.boolean
, uma para TrueClass / FalseClass e outra para Object.Time#==
Ruby 1.8 faz com que uma comparação com valores não-Time retorne nulo em vez de falso.Se seu código puder ser sensivelmente escrito como uma declaração de caso, isso é bastante decente:
fonte
Um objeto que é um booleano terá uma classe de TrueClass ou FalseClass, portanto, a seguinte linha única deve fazer o truque
O seguinte também forneceria resultado de verificação de tipo booleano verdadeiro / falso
fonte
Portanto, tente esta
(x == true) ^ (x == false)
nota que você precisa entre parênteses, mas isso é mais bonito e compacto.Ele até passa o sugerido como "cuak", mas não um "cuak" ...
class X; def !; self end end ; x = X.new; (x == true) ^ (x == false)
Nota : Veja que isso é tão básico que você pode usá-lo em outros idiomas também, que não fornece uma "coisa é booleana".
Nota 2 : Você também pode usar isso para dizer que uma das coisas é ??:
"red", "green", "blue"
se vocêadd more XORS
... ou diz que essa é uma das coisas ??:4, 5, 8, 35
.fonte
Essa gema adiciona uma classe booleana ao Ruby com métodos úteis.
https://github.com/RISCfuture/boolean
Usar:
Então seu
funcionará exatamente como você espera.
fonte
Não. Não é como se você tivesse seu código. Não há nenhuma classe chamada booleana. Agora, com todas as respostas que você tem, você poderá criar uma e usá-la. Você sabe como criar aulas, não é? Só vim aqui porque estava me perguntando essa ideia. Muitas pessoas podem dizer "Por quê? Você só precisa saber como Ruby usa Boolean". É por isso que você obteve as respostas que obteve. Então, obrigado pela pergunta. Alimento para o pensamento. Por que Ruby não tem uma classe booleana?
Lembre-se de que os objetos não têm tipos. Eles são classes. Objetos possuem dados. É por isso que quando você diz que tipos de dados é um pouco impróprio.
Tente também o rand 2 porque o rand 1 parece sempre dar 0. rand 2 dará 1 ou 0 clique em executar algumas vezes aqui. https://repl.it/IOPx/7
Embora eu não saiba como fazer uma aula booleana. Eu experimentei com isso, mas ...
Pelo menos temos essa classe agora, mas quem sabe como obter os valores certos?
fonte