如何检查Ruby对象是否为布尔值

时间:2010-06-12 09:57:57

标签: ruby typechecking

我似乎无法轻易检查对象是否是布尔值。 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))

9 个答案:

答案 0 :(得分:126)

我能想到的最简单的方式:

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

答案 1 :(得分:88)

我发现这是简洁和自我记录的:

[true, false].include? foo

如果使用Rails或ActiveSupport,您甚至可以使用in?

进行直接查询
foo.in? [true, false]

检查所有可能的值并不是我推荐用于浮点数的东西,但只有两个可能值时才可行!

答案 2 :(得分:84)

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

答案 3 :(得分:22)

如上所述,没有布尔类只有TrueClass和FalseClass,但是你可以使用任何对象作为if / unless的主题,除了FalseClass和nil的实例之外,一切都是真的

布尔测试返回FalseClass或TrueClass

的实例
(1 > 0).class #TrueClass

以下针对Object的monkeypatch将告诉您某些内容是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

答案 4 :(得分:13)

如果你的代码可以合理地写成一个case语句,那就非常不错了:

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

答案 5 :(得分:5)

作为布尔值的对象将具有TrueClass或FalseClass类,因此以下单行应该可以做到这一点

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

以下内容还将为您提供true / false布尔类型检查结果

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

答案 6 :(得分:4)

所以试试看(x == true) ^ (x == false)注意你需要括号,但这更美观,更紧凑。

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

注意 :看到这是非常基本的,您也可以在其他语言中使用它,但不提供“事物是布尔值”。

注意2 :如果你"red", "green", "blue" ......或者你也可以用它来表示事情之一:add more XORS说这件事是?? 4, 5, 8, 35之一。

答案 7 :(得分:0)

没有。不像你有你的代码。没有任何名为Boolean的类。现在有了你所拥有的所有答案,你应该能够创建一个并使用它。你知道如何创建课程吗?我才来到这里,因为我自己只是想知道这个想法。很多人可能会说"为什么?你必须知道Ruby如何使用Boolean"。这就是你得到答案的原因。谢谢你提出这个问题。值得深思。为什么Ruby没有布尔类?

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

至少我们现在有那个班,但谁知道如何获得正确的价值?

答案 8 :(得分:0)

此gem通过有用的方法向Ruby添加了一个布尔类。

https://github.com/RISCfuture/boolean

使用:

require 'boolean'

然后您的

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

将完全按照您的预期工作。