调节三态逻辑

时间:2015-01-14 11:10:11

标签: ruby conditional

我有一个变量,它从三态布尔值中取出一个值:

asap = true
asap = false
asap = nil

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

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

区分falsenil的声明是:

if asap == false
  puts 'False'
end

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

1 个答案:

答案 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}}。