Как проверить, является ли объект 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))

Ответ 1

Простейший способ, о котором я могу думать:

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

Ответ 2

Я считаю это кратким и самодокументирующимся:

[true, false].include? foo

При использовании Rails или ActiveSupport вы даже можете сделать прямой запрос, используя in?

foo.in? [true, false]

Проверка всех возможных значений не является чем-то, что я рекомендую для поплавков, но возможно, когда есть только два возможных значения!

Ответ 3

В 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

Ответ 4

Как указано выше, нет логического класса только TrueClass и FalseClass, однако вы можете использовать любой объект в качестве объекта if/if, и все верно, за исключением случаев FalseClass и nil

Логические тесты возвращают экземпляр FalseClass или TrueClass

(1 > 0).class #TrueClass

Следующий monkeypatch для Object скажет вам, что-то является экземпляром 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

Ответ 5

Если ваш код можно разумно записать в качестве примера, это довольно прилично:

case mybool
when TrueClass, FalseClass
  puts "It a bool!"
else
  puts "It something else!"
end

Ответ 6

Объект, который является булевым, будет либо иметь класс TrueClass, либо FalseClass, поэтому следующий однострочный слой должен сделать трюк

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

Следующее также даст вам результат проверки истинного/ложного логического типа

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

Ответ 7

Итак, попробуйте это (x == true) ^ (x == false) отметить, что вам нужна скобка, но это более красиво и компактно.

Он даже передает предложенный как "cuak", но не "cuak"... class X; def !; self end end ; x = X.new; (x == true) ^ (x == false)

Примечание. Посмотрите, что это так просто, что вы можете использовать его и на других языках, что не обеспечивает "вещь логическая".

Примечание 2. Также вы можете использовать это, чтобы сказать, что вещь является одной из: "red", "green", "blue", если вы add more XORS... или говорите, что эта вещь является одной из: 4, 5, 8, 35.

Ответ 8

Нет. Не похоже, что у вас есть код. Нет класса с именем Boolean. Теперь со всеми ответами, которые у вас есть, вы должны иметь возможность создать и использовать его. Вы знаете, как создавать классы, не так ли? Я только приехал сюда, потому что сам просто задавался этой идеей. Многие могут сказать: "Почему? Вы должны просто знать, как Ruby использует Boolean". Вот почему вы получили ответы, которые вы сделали. Так что спасибо за вопрос. Пища для размышлений. Почему Ruby не имеет булевского класса?

NameError: uninitialized constant Boolean

Имейте в виду, что объекты не имеют типов. Это классы. Объекты имеют данные. Поэтому, когда вы говорите о типах данных, это немного неправильно.

Также попробуйте rand 2, потому что rand 1 всегда всегда дает 0. rand 2 даст 1 или 0 нажмите несколько раз здесь. https://repl.it/IOPx/7

Хотя я не знал бы, как самому заниматься булевым классом. Я экспериментировал с ним, но...

class Boolean < TrueClass
  self
end

true.is_a?(Boolean) # => false
false.is_a?(Boolean) # => false

По крайней мере, у нас есть этот класс, но кто знает, как получить правильные значения?

Ответ 9

Этот гем добавляет в Ruby логический класс с полезными методами.

https://github.com/RISCfuture/boolean

Использование:

require 'boolean'

Тогда ваш

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

будет работать именно так, как вы ожидаете.