Как проверить, является ли объект 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))
118
задан the Tin Man 22 May 2019 в 23:45
поделиться

3 ответа

Самый простой способ, который я могу придумать:

# checking whether foo is a boolean
!!foo == foo
131
ответ дан 24 November 2019 в 01:53
поделиться

В 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
ответ дан 24 November 2019 в 01:53
поделиться

Как было сказано выше, не существует класса boolean, только TrueClass и FalseClass, однако вы можете использовать любой объект в качестве субъекта if/unless и все будет истинным, кроме экземпляров 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
23
ответ дан 24 November 2019 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: