我似乎无法轻易检查对象是否是布尔值。 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))
答案 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
类,检查的唯一方法是执行您正在执行的操作(将对象与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
答案 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)
将完全按照您的预期工作。