如何检查 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))
123638 次浏览

Ruby 中没有 Boolean类,检查的唯一方法是做你正在做的事情(比较对象和 truefalse或者对象的类和 TrueClassFalseClass)。但是想不出为什么需要这个功能,你能解释一下吗?:)

然而,如果你 真的需要这个功能,你可以破解它:

module Boolean; end
class TrueClass; include Boolean; end
class FalseClass; include Boolean; end


true.is_a?(Boolean) #=> true
false.is_a?(Boolean) #=> true

如上所述,不存在布尔类,只有 TrueClass 和 FalseClass,但是您可以使用任何对象作为 if/until 的主题,并且除了 FalseClass 和 nil 的实例之外,一切都是 true

布尔测试返回 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

我能想到的最简单的方法是:

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

一个布尔对象要么有一个 TrueClass 类,要么有一个 FalseClass 类,所以下面的一行程序应该可以解决这个问题

mybool = true
mybool.class == TrueClass || mybool.class == FalseClass
=> true

下面还将给出布尔类型检查的 true/false 结果

mybool = true
[TrueClass, FalseClass].include?(mybool.class)
=> true

如果您的代码可以明智地写成 case 语句,那么这是相当不错的:

case mybool
when TrueClass, FalseClass
puts "It's a bool!"
else
puts "It's something else!"
end

所以试试这个 (x == true) ^ (x == false)注意,你需要括号,但这个更漂亮和紧凑。

它甚至通过了建议的“呱”而不是“呱”... class X; def !; self end end ; x = X.new; (x == true) ^ (x == false)

注意 : 这是非常基本的,可以在其他语言中使用,但是不能提供“ thing is boolean”。

注2 : 也可以用这个来说事情是? ?: "red", "green", "blue"如果你 add more XORS... 或者说这个东西是一个? ?校对: 4, 5, 8, 35

我认为这是简明扼要的自我记录:

[true, false].include? foo

如果使用 Rails 或 ActiveSupport,您甚至可以使用 in?进行直接查询

foo.in? [true, false]

对于 float,我不推荐检查所有可能的值,但是当只有两个可能的值时,检查是可行的!

没有。不像你有自己的原则。没有叫布尔型的类。现在有了所有的答案,你应该能够创建一个并使用它。你知道怎么创建类吧?我来这里只是因为我自己也在想这个主意。许多人可能会说: “为什么?你只需要知道 Ruby 是如何使用 Boolean 的”。所以你才会得到你想要的答案。谢谢你的提问。值得深思。为什么 Ruby 没有布尔类?

NameError: uninitialized constant Boolean

请记住,Object 没有类型。他们是阶级。对象有数据。这就是为什么说数据类型有点用词不当。

也可以试试 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

至少我们现在有了这个类,但是谁知道如何得到正确的值呢?

这个 gem 向 Ruby 添加了一个带有有用方法的 Boolean 类。

Https://github.com/riscfuture/boolean

用途:

require 'boolean'

那你的

true.is_a?(Boolean)
false.is_a?(Boolean)

会如你所愿。