Проверьте, является ли объект 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))
8 ответов:
нет
Boolean
класс в Ruby, единственный способ проверить-это сделать то, что вы делаете (сравнивая объект с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
Я считаю, это должен быть лаконичным и самодокументируемыми:
[true, false].include? foo
при использовании Rails или ActiveSupport, вы даже можете сделать прямой запрос с помощью
in?
foo.in? [true, false]
проверка всех возможных значений-это не то, что я бы рекомендовал для поплавков, но возможно, когда есть только два возможных значения!
как указано выше, нет логического класса только TrueClass и FalseClass однако вы можете использовать любой объект в качестве субъекта if / unless и все верно, кроме экземпляров FalseClass и nil
логические тесты возвращают экземпляр FalseClass или TrueClass
(1 > 0).class #TrueClass
следующий monkeypatch to 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
Если ваш код может быть разумно написан как оператор case, это довольно прилично:
case mybool when TrueClass, FalseClass puts "It's a bool!" else puts "It's something else!" end
объект, который является логическим, будет иметь класс TrueClass или FalseClass, поэтому следующий однострочный должен сделать трюк
mybool = true mybool.class == TrueClass || mybool.class == FalseClass => true
следующее также даст вам результат проверки типа true / false boolean
mybool = true [TrueClass, FalseClass].include?(mybool.class) => true
так что попробуйте это
(x == true) ^ (x == false)
обратите внимание, что вам нужна скобка, но это более красиво и компактно.Он даже передает предложенное как "куак", но не"куак"...
class X; def !; self end end ; x = X.new; (x == true) ^ (x == false)
Примечание: смотрите, что это так просто, что вы можете использовать его и на других языках, что не дает "вещь логическая".
примечание 2.: также вы можете использовать это, чтобы сказать, что это один из??:
"red", "green", "blue"
Если выadd more XORS
... или сказать, что это одна из них??:4, 5, 8, 35
.
нет. Не то чтобы у тебя был свой код. Существует не какой-либо класс логическое. Теперь все ответы у вас есть, вы должны быть в состоянии создать один и использовать его. Вы ведь знаете, как создавать классы, не так ли? Я пришел сюда только потому, что мне самой была интересна эта идея. Многие люди могут сказать: "почему? Вы должны просто знать, как Ruby использует Boolean". Вот почему вы получили ответы, которые вы сделали. Так что спасибо за вопрос. Пища для размышлений. Почему у Ruby нет логического значения класс?
NameError: uninitialized constant Boolean
имейте в виду, что объекты не имеют типов. Это классы. Объекты имеют данные. Вот почему, когда вы говорите типы данных, это немного неправильное название.
также попробуйте rand 2, потому что rand 1, кажется, всегда дает 0. ранд 2 даст 1 или 0 нажмите кнопку выполнить несколько раз здесь. https://repl.it/IOPx/7
хотя я бы не знал, как сделать логический класс сам. Я экспериментировал с ним, но.....
class Boolean < TrueClass self end true.is_a?(Boolean) # => false false.is_a?(Boolean) # => false
At по крайней мере, у нас есть этот класс сейчас, но кто знает, как получить правильные значения?