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


Answers:


136

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

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

6
X级; def !; 自我终结; x = X.new; !! x == x#=> true
Alexey 2012年

5
是的,这就是所谓的鸭子输入和OOP的核心原理。我认为这是一个功能。
Konstantin Haase 2012年

62
简短不一定意味着简单。我的意思是,wtf是吗?
Grant Birchmeier 2013年

11
将foo转换为布尔值,检查是否与foo相同。
Konstantin Haase

9
请注意,某些检查器(例如RuboCop)将双重否定视为不良样式。
sschuberth '16

103

我发现这是简洁明了的文档:

[true, false].include? foo

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

foo.in? [true, false]

我不建议针对浮点数检查所有可能的值,但是当只有两个可能的值时可行!


1
迄今为止的最佳答案,尽管我也喜欢foo == true or foo == false有人发表评论。
瑞安·泰勒

3
我之所以喜欢它,是因为它的意图不那么神秘!!foo == foo
–strings88keys

彻头彻尾的pythonic!到目前为止,绝对是最语义化的答案。
JM Janzen

85

BooleanRuby中没有类,唯一的检查方法是执行您正在做的事情(将对象与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

1
尝试根据当前值进行类型转换。
兰斯·波拉德

75
“你为什么会那样?” (和衍生产品)只是工程师可能会提出的另一个最烦人的问题:)
vemv 2014年

11
+1是因为我可以在rspec中使用它,例如:expect(some_method?(data)).to be_a(Boolean)
Automatico

3
其他需要检查类型的情况是实现数据库适配器并且需要使用带包装"quotes"
符的

23

如上所述,没有布尔类,只有TrueClass和FalseClass,但是您可以将任何对象用作if / unless的主题,并且除FalseClass和nil的实例外,其他所有内容都为true

布尔测试返回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
只写就简单self == true or self == false。这些是TrueClass和FalseClass的唯一实例。
Chuck 2010年

@chuck返回相同的结果,除了Time.now.boolean吗?返回nil。知道为什么吗?
Steve Weet 2010年

在方法中定义一个关于self的类检查有点不可行。您应该定义的两个版本boolean,一个用于TrueClass / FalseClass,一个用于Object。
Konstantin Haase 2010年

4
原因是Time#==Ruby 1.8 版本中的错误导致与非Time值的比较返回nil而不是false。
Chuck 2010年

17

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

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

6

布尔型对象将具有TrueClass或FalseClass类,因此以下单线代码可以解决问题

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

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

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

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


为什么要异或?为什么不呢?
纳基隆


0

不,不像您有您的代码。没有任何名为Boolean的类。现在,有了所有答案,您应该可以创建一个答案并使用它。您知道如何创建类吗?我只是来这里是因为我自己只是想知道这个主意。许多人可能会说“为什么?您必须只知道Ruby如何使用布尔值”。这就是为什么您得到答案的原因。所以,谢谢你的提问。值得深思。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

至少我们现在有该课程,但是谁知道如何获得正确的价值观?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.