调节三态逻辑

Conditioning tri-state logic

我有一个从三态布尔值中获取值的变量:

asap = true
asap = false
asap = nil

Ruby 的条件将它们解释为真或假。特别是,nilfalse没有区别。

asap = nil
unless asap
  puts 'False'
end
# => 'False'

区别falsenil的一个说法是:

if asap == false
  puts 'False'
end

但是 Ruby我的 6.3.3 抱怨表达式可以简化,并建议 unless asap。有没有不同的(正确的)方法来进行调节?

TLDNR;

if FalseClass === asap
  puts 'False'
end

Tri-state通常暗示有三种可能的分支,这让我不得不认为if和三态?都不是普遍适用的。

puts case asap
     when FalseClass then 'False' 
     when TrueClass then 'True' 
     when NilClass then 'Nil' 
     else 'You are kidding on me, aren’t you?'
     end

希望对您有所帮助。

UPD:越想越觉得三元也可以:

puts asap.nil? ? 'Nil' : asap ? 'True' : 'False'

UPD2: 实际上,三等比较运算符在 case 中透明地使用并且显然对 [=18 计算为 true =] 和 true === true 也可能满足 IDEA aka RubyMine 的要求:

if asap === false
  puts 'False'
end

UPD3:正如评论中提到的@sawa,这里的 IDEA 是错误的,因为 nil == false 的计算结果为 false,因此 == false 是通常不等于 unless.