检查Ruby对象是否是布尔值

Lan*_*ard 118 ruby typechecking

似乎无法找到如何轻松检查对象是否是布尔值.Ruby中有这样的东西吗?

true.is_a?(Boolean)
false.is_a?(Boolean)
Run Code Online (Sandbox Code Playgroud)

现在我正在这样做,并希望缩短它:

some_var = rand(1) == 1 ? true : false
(some_var.is_a?(TrueClass) || some_var.is_a?(FalseClass))
Run Code Online (Sandbox Code Playgroud)

Kon*_*ase 131

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

# checking whether foo is a boolean
!!foo == foo
Run Code Online (Sandbox Code Playgroud)

  • 简短并不一定意味着简单.我的意思是,wtf是那个? (60认同)
  • 将foo变为布尔值,检查是否与foo相同. (10认同)
  • 请注意,一些跳棋(如[RuboCop](https://github.com/bbatsov/rubocop))将双重否定视为不良风格. (9认同)
  • X级; def !; 自我结束; x = X.new; !! x == x#=> true (6认同)
  • 是的,这就是所谓的鸭子打字和OOP的核心原则.我认为这是一个功能. (5认同)
  • 它的问题是"如果它像鸭子一样走路"并不意味着"它像鸭子一样嘎嘎叫".相应地,`!! pseudo_bool == pseudo_bool`并不意味着`pseudo_bool&true == pseudo_bool`. (2认同)
  • @Dan 不,不是。如果`foo = ""`,则`!!foo` 为真,并且真不等于空字符串。 (2认同)
  • -1:这不会检查 `foo` 是否是布尔值,这会将 `foo` 的值_转换为布尔值。也就是说,这与 `foo.is_a?(TrueClass) || 不同。foo.is_a?(FalseClass) (2认同)

mah*_*off 96

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

[true, false].include? foo
Run Code Online (Sandbox Code Playgroud)

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

foo.in? [true, false]
Run Code Online (Sandbox Code Playgroud)

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

  • 我喜欢这个,因为它的意图比 `!!foo == foo` 更不神秘。 (4认同)

hor*_*guy 84

BooleanRuby中没有类,唯一的检查方法就是做你正在做的事情(比较对象true和/ false或对象的类TrueClassFalseClass).想不出你为什么需要这个功能,你能解释一下吗?:)

但是,如果您确实需要此功能,可以将其破解为:

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

true.is_a?(Boolean) #=> true
false.is_a?(Boolean) #=> true
Run Code Online (Sandbox Code Playgroud)

  • "为什么你会这样呢?" (和衍生物)只是工程师可以制造另一个最令人烦恼的问题之一:) (72认同)
  • +1因为我可以在rspec中使用它:`expect(some_method?(data)).to be_a(Boolean)` (11认同)
  • 其他需要检查类型的情况,就是当你实现数据库适配器并需要用"引号"包裹字符串时`而不是数字和布尔值 (3认同)
  • 尝试根据当前值进行类型转换。 (2认同)

Ste*_*eet 23

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

布尔测试返回FalseClass或TrueClass的实例

(1 > 0).class #TrueClass
Run Code Online (Sandbox Code Playgroud)

以下针对Object的monkeypatch将告诉您某些内容是TrueClass还是FalseClass的实例

class Object
  def boolean?
    self.is_a?(TrueClass) || self.is_a?(FalseClass) 
  end
end
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

  • 更简单只是写'self == true或self == false`.这些是TrueClass和FalseClass的唯一实例. (4认同)
  • 原因是Ruby 1.8中"Time#=="版本中的错误导致与非Time值的比较返回nil而不是false. (4认同)

Hen*_*k N 16

如果你的代码可以合理地写成case语句,那么这是相当不错的:

case mybool
when TrueClass, FalseClass
  puts "It's a bool!"
else
  puts "It's something else!"
end
Run Code Online (Sandbox Code Playgroud)


小智 5

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

mybool = true
mybool.class == TrueClass || mybool.class == FalseClass
=> true
Run Code Online (Sandbox Code Playgroud)

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

mybool = true    
[TrueClass, FalseClass].include?(mybool.class)
=> true
Run Code Online (Sandbox Code Playgroud)