我有一个变量,它从三态布尔值中取出一个值:
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
但RubyMine 6.3.3抱怨表达式可以简化,并建议unless asap
。是否有不同的(正确的)方法来进行调节?
答案 0 :(得分:4)
TLDNR;
if FalseClass === asap
puts 'False'
end
三态通常表明有三种可能的分支,这迫使我认为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
中透明使用,显然评估true
false === false
和{{} true === true
1}}也可能满足IDEA aka RubyMine:
if asap === false
puts 'False'
end
UPD3 :正如@sawa在评论中提到的那样,IDEA错误,因为nil == false
评估为false
,因此== false
通常不等于{ {1}}。