我似乎不能很容易地检查一个对象是否是布尔型的。在 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 中没有 Boolean类,检查的唯一方法是做你正在做的事情(比较对象和 true和 false或者对象的类和 TrueClass和 FalseClass)。但是想不出为什么需要这个功能,你能解释一下吗?:)
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
如上所述,不存在布尔类,只有 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)注意,你需要括号,但这个更漂亮和紧凑。
(x == true) ^ (x == false)
它甚至通过了建议的“呱”而不是“呱”... class X; def !; self end end ; x = X.new; (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。
"red", "green", "blue"
add more XORS
4, 5, 8, 35
我认为这是简明扼要的自我记录:
[true, false].include? foo
如果使用 Rails 或 ActiveSupport,您甚至可以使用 in?进行直接查询
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'
那你的
会如你所愿。