Кажется, я не могу легко проверить, является ли объект логическим. Есть ли что-то подобное в 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))
ruby
typechecking
Лэнс Поллард
источник
источник
Ответы:
Самый простой способ, который я могу придумать:
источник
Я считаю это кратким и самодокументированным:
Если вы используете Rails или ActiveSupport, вы даже можете выполнить прямой запрос, используя
in?
Я бы не рекомендовал проверку всех возможных значений для чисел с плавающей запятой, но это выполнимо, когда есть только два возможных значения!
источник
foo == true or foo == false
что кто-то оставил комментарий.!!foo == foo
.В
Boolean
Ruby нет класса, единственный способ проверить - это сделать то, что вы делаете (сравнивая объект сtrue
и /false
или класс объекта сTrueClass
иFalseClass
). Не можете придумать, зачем вам эта функция, можете объяснить? :)Однако, если вам действительно нужна эта функция, вы можете взломать ее:
источник
expect(some_method?(data)).to be_a(Boolean)
"quotes"
но не числами и логическими значениями,Как указано выше, нет логического класса, только TrueClass и FalseClass, однако вы можете использовать любой объект в качестве объекта if / except, и все верно, кроме экземпляров FalseClass и nil
Логические тесты возвращают экземпляр FalseClass или TrueClass
Следующий патч обезьяны к Object сообщит вам, является ли что-то экземпляром TrueClass или FalseClass.
Выполнение некоторых тестов с irb дает следующие результаты
источник
self == true or self == false
. Это единственные экземпляры TrueClass и FalseClass.boolean
одну для TrueClass / FalseClass и одну для Object.Time#==
Ruby 1.8 приводит к тому, что сравнение с не-Time значениями возвращает nil, а не false.Если ваш код может быть разумно написан как оператор case, это довольно прилично:
источник
Объект, который является логическим, будет либо иметь класс TrueClass, либо FalseClass, поэтому следующий однострочный объект должен помочь
Следующее также даст вам результат проверки логического типа true / false
источник
Так что попробуйте эту
(x == true) ^ (x == false)
заметку, вам нужны скобки, но они более красивы и компактны.Он даже передает предложенное "cuak", но не "cuak" ...
class X; def !; self end end ; x = X.new; (x == true) ^ (x == false)
Примечание. Обратите внимание, что это настолько просто, что вы можете использовать его и на других языках, что не обеспечивает логического значения.
Примечание 2 : Также вы можете использовать это, чтобы сказать, что это одна из ??:
"red", "green", "blue"
if youadd more XORS
... или говорите, что это одна из ??:4, 5, 8, 35
.источник
Этот гем добавляет в Ruby логический класс с полезными методами.
https://github.com/RISCfuture/boolean
Использование:
Тогда твой
будет работать именно так, как вы ожидаете.
источник
Нет. Не то чтобы у тебя есть код. Класса с именем Boolean не существует. Теперь, когда у вас есть все ответы, вы сможете создать его и использовать. Вы ведь знаете, как создавать классы, не так ли? Я пришла сюда только потому, что сама сама задавалась вопросом. Многие люди могут спросить: «Почему? Вы должны просто знать, как Ruby использует Boolean». Вот почему вы получили ответы. Так что спасибо за вопрос. Пища для размышлений. Почему в Ruby нет логического класса?
Помните, что у объектов нет типов. Это классы. У объектов есть данные. Вот почему, когда вы говорите о типах данных, это немного неправильно.
Также попробуйте rand 2, потому что rand 1, кажется, всегда дает 0. rand 2 даст здесь 1 или 0 кликов несколько раз. https://repl.it/IOPx/7
Хотя я бы не знал, как самому создать логический класс. Я экспериментировал с этим, но ...
По крайней мере, теперь у нас есть этот класс, но кто знает, как получить правильные значения?
источник