调节三态逻辑
Conditioning tri-state logic
我有一个从三态布尔值中获取值的变量:
asap = true
asap = false
asap = nil
Ruby 的条件将它们解释为真或假。特别是,nil
与false
没有区别。
asap = nil
unless asap
puts 'False'
end
# => 'False'
区别false
和nil
的一个说法是:
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
.
我有一个从三态布尔值中获取值的变量:
asap = true
asap = false
asap = nil
Ruby 的条件将它们解释为真或假。特别是,nil
与false
没有区别。
asap = nil
unless asap
puts 'False'
end
# => 'False'
区别false
和nil
的一个说法是:
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
.