我似乎无法轻松地检查一个对象是否为布尔值。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中有类似的东西吗?
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))
我认为这很简洁并且可以自我说明:
[true, false].include? foo
如果使用Rails或ActiveSupport,您甚至可以使用in?
直接进行查询。
foo.in? [true, false]
在浮点数的情况下,我不建议检查所有可能的值,但当只有两个可能的值时是可行的!
foo == true or foo == false
。 - Ryan Taylor!!foo == foo
那样含糊。 - stringsn88keys我所能想到的最简单方法:
# 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
expect(some_method?(data)).to be_a(Boolean)
。 - Automatico如上所述,Ruby中没有布尔类,只有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
self == true 或者 self == false
。这些是 TrueClass 和 FalseClass 的唯一实例。 - Chuckboolean
,一个用于TrueClass/FalseClass,另一个用于Object。 - Konstantin HaaseTime#==
方法中的一个 bug,导致与非 Time 类型的值进行比较时返回的不是 false 而是 nil。 - Chuck如果您的代码可以合理地编写成case语句,那么这是相当不错的:
case mybool
when TrueClass, FalseClass
puts "It's a bool!"
else
puts "It's something else!"
end
mybool = true
mybool.class == TrueClass || mybool.class == FalseClass
=> true
mybool = true
[TrueClass, FalseClass].include?(mybool.class)
=> true
尝试一下这个表达式 (x == true) ^ (x == false)
,请注意需要括号,但是这种写法更加简洁美观。
甚至可以通过类似 "cuak" 但不是 "cuak" 的测试,class X; def !; self end end ; x = X.new; (x == true) ^ (x == false)
注意:这个方法非常基础,你甚至可以在其他不提供“布尔值检查”的语言中使用。
注意2:你也可以使用这个方法来判断一个变量是否为以下几个值之一:"red", "green", "blue"
,只需添加更多的异或操作符即可... 或者说这个变量是否为以下几个值之一:4, 5, 8, 35
。
require 'boolean'
true.is_a?(Boolean)
false.is_a?(Boolean)
将按您的期望完全工作。
不是像你的代码那样。没有叫做Boolean的类。现在有了所有的答案,你应该能够创建一个并使用它。你知道如何创建类吗?我来这里只是因为我自己也在思考这个想法。许多人可能会说“为什么?你只需要知道Ruby如何使用布尔值”。这就是你得到这些答案的原因。所以感谢你的问题。这是一个值得思考的问题。为什么Ruby没有一个Boolean类呢?
NameError: uninitialized constant Boolean
请记住,对象没有类型。它们是类。对象有数据。所以当你说数据类型时,这有点不准确。
另外尝试rand 2,因为rand 1似乎总是给出0。 rand 2将给出1或0 在这里点击运行几次。 https://repl.it/IOPx/7
虽然我不知道如何制作一个布尔类。我已经尝试过了,但是...
class Boolean < TrueClass
self
end
true.is_a?(Boolean) # => false
false.is_a?(Boolean) # => false