web-dev-qa-db-ja.com

Rubyオブジェクトがブール値かどうかを確認する方法

オブジェクトがブール値であるかどうかを簡単に確認できないようです。 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))
115
Lance Pollard

私が考えることができる最も簡単な方法:

# checking whether foo is a boolean
!!foo == foo
128

私はこれが簡潔で自己文書化されていると思います:

[true, false].include? foo

RailsまたはActiveSupportを使用している場合は、 in? を使用して直接クエリを実行することもできます

foo.in? [true, false]

すべての可能な値に対してチェックすることは、私がフロートに推奨するものではありませんが、2つの可能な値しかない場合に実行可能です!

95
mahemoff

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
84
horseyguy

上記のように、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
22
Steve Weet

コードをcaseステートメントとして賢明に記述できる場合、これはかなり適切です。

case mybool
when TrueClass, FalseClass
  puts "It's a bool!"
else
  puts "It's something else!"
end
15
Henrik N

ブール値であるオブジェクトには、TrueClassまたはFalseClassのクラスがあるため、次の1行でトリックを行う必要があります。

mybool = true
mybool.class == TrueClass || mybool.class == FalseClass
=> true

次の場合、true/falseブール型チェック結果も得られます。

mybool = true    
[TrueClass, FalseClass].include?(mybool.class)
=> true
5
user1966234

したがって、これを試してください(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

4
tyoc213

このgemは、便利なメソッドを使用してRubyにブールクラスを追加します。

https://github.com/RISCfuture/boolean

つかいます:

require 'boolean'

それからあなたの

true.is_a?(Boolean)
false.is_a?(Boolean)

期待どおりに動作します。

1
Convincible

いいえ。コードを持っているわけではありません。 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

少なくとも今はそのクラスがありますが、正しい値を取得する方法を知っているのは誰ですか?

0