オブジェクトがブール値であるかどうかを簡単に確認できないようです。 Rubyにこのようなものはありますか?
true.is_a?(Boolean)
false.is_a?(Boolean)
今私はこれをやっていて、短くしたいと思います:
some_var = Rand(1) == 1 ? true : false
(some_var.is_a?(TrueClass) || some_var.is_a?(FalseClass))
私が考えることができる最も簡単な方法:
# checking whether foo is a boolean
!!foo == foo
私はこれが簡潔で自己文書化されていると思います:
[true, false].include? foo
RailsまたはActiveSupportを使用している場合は、 in?
を使用して直接クエリを実行することもできます
foo.in? [true, false]
すべての可能な値に対してチェックすることは、私がフロートに推奨するものではありませんが、2つの可能な値しかない場合に実行可能です!
RubyにはBoolean
クラスはありません。チェックする唯一の方法は、実行していることを実行することです(オブジェクトをtrue
およびfalse
と比較するか、オブジェクトのクラスをTrueClass
およびFalseClass
)。しかし、なぜこの機能が必要なのか考えられません、説明できますか? :)
本当にこの機能が必要な場合は、次のようにハックできます:
module Boolean; end
class TrueClass; include Boolean; end
class FalseClass; include Boolean; end
true.is_a?(Boolean) #=> true
false.is_a?(Boolean) #=> true
上記のように、TrueClassとFalseClassだけのブールクラスはありませんが、if/unlessの対象として任意のオブジェクトを使用でき、FalseClassとnilのインスタンスを除くすべてがtrueです。
ブールテストはFalseClassまたはTrueClassのインスタンスを返します
(1 > 0).class #TrueClass
Objectへの次のmonkeypatchは、何かがTrueClassまたはFalseClassのインスタンスであるかどうかを示します
class Object
def boolean?
self.is_a?(TrueClass) || self.is_a?(FalseClass)
end
end
Irbでいくつかのテストを実行すると、次の結果が得られます
?> "String".boolean?
=> false
>> 1.boolean?
=> false
>> Time.now.boolean?
=> false
>> nil.boolean?
=> false
>> true.boolean?
=> true
>> false.boolean?
=> true
>> (1 ==1).boolean?
=> true
>> (1 ==2).boolean?
=> true
コードをcaseステートメントとして賢明に記述できる場合、これはかなり適切です。
case mybool
when TrueClass, FalseClass
puts "It's a bool!"
else
puts "It's something else!"
end
ブール値であるオブジェクトには、TrueClassまたはFalseClassのクラスがあるため、次の1行でトリックを行う必要があります。
mybool = true
mybool.class == TrueClass || mybool.class == FalseClass
=> true
次の場合、true/falseブール型チェック結果も得られます。
mybool = true
[TrueClass, FalseClass].include?(mybool.class)
=> true
したがって、これを試してください(x == true) ^ (x == false)
括弧が必要ですが、これはより美しくコンパクトです。
「cuak」のような提案は通過しますが、「cuak」は通過しません... class X; def !; self end end ; x = X.new; (x == true) ^ (x == false)
Note:これは非常に基本的なものであり、他の言語でも使用できるため、「事はブール値です」。
注2:また、これを使用して、次のいずれかを指定できますか?:"red", "green", "blue"
if you add more XORS
...または、これは次のいずれかと言いますか?:4, 5, 8, 35
。
このgemは、便利なメソッドを使用してRubyにブールクラスを追加します。
https://github.com/RISCfuture/boolean
つかいます:
require 'boolean'
それからあなたの
true.is_a?(Boolean)
false.is_a?(Boolean)
期待どおりに動作します。
いいえ。コードを持っているわけではありません。 Booleanという名前のクラスはありません。これで、すべての回答が得られたので、作成して使用できるようになります。クラスを作成する方法を知っていますか?私はこのアイデアを自分で考えていたので、ここに来ただけです。多くの人が「なぜ?RubyがBooleanを使用する方法を知っている必要がある」と言うかもしれません。それがあなたがした答えを得た理由です。質問をありがとう。思考の糧。 Rubyにブール型クラスがないのはなぜですか?
NameError: uninitialized constant Boolean
オブジェクトには型がないことに注意してください。それらはクラスです。オブジェクトにはデータがあります。そのため、データ型と言うとき、それは少し間違った名前です。
また、Rand 1は常に0を与えるように見えるため、Rand 2を試してください。Rand2は、1回または0回のクリックをここで数回実行します。 https://repl.it/IOPx/7
ブールクラスを自分で作成する方法はわかりませんが。私はそれを試しましたが...
class Boolean < TrueClass
self
end
true.is_a?(Boolean) # => false
false.is_a?(Boolean) # => false
少なくとも今はそのクラスがありますが、正しい値を取得する方法を知っているのは誰ですか?