Я, может казаться, не проверяю, является ли объект булевской переменной легко. Есть ли в 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
В 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
Как было сказано выше, не существует класса 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