Проверьте, является ли объект 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 106

8 ответов:

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

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

нет 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 по крайней мере, у нас есть этот класс сейчас, но кто знает, как получить правильные значения?