Ruby中空字符串与布尔值true比较为何返回false?
Ruby 布尔逻辑与相等判断规则说明
首先先明确Ruby最核心的真值判定规则:
Ruby 中只有 false 和 nil 两个值会在条件判断中被当作假,其余所有值——包括空字符串""、数字0、空数组[]、空哈希{}这类在其他语言中常被判定为假的值——全部属于真值。
各段代码的逻辑逐段解释
基础if条件判断
if "" true else false end # => true这段返回true完全符合上述真值规则:
""既不是false也不是nil,条件成立,自然进入true分支。双感叹号转布尔值
!!("") # => true!!是Ruby里常用的快速转原生布尔值的写法:第一个!会把后面的值按真值规则取反得到布尔值,第二个!再把结果取反,最终得到的就是原值在条件判断中对应的布尔结果。因为""是真值,所以最终返回true。case相等运算符判断
"" === true # => falseRuby里的
===是case相等运算符,主要给case/when分支判断使用,不同类有各自的实现逻辑。String类的===判断逻辑和==基本一致,只会在右侧是同内容的字符串时返回true,true是TrueClass的布尔实例,和字符串类型完全不同,返回false符合预期。存在疑问的相等判断
"" == true # => false这里的核心误区是把「条件判断中被当作真值」和「值与布尔值
true相等」两个概念搞混了:==是相等判断运算符,作用是判断左右两个值是否逻辑相等,不同类会有自己的判断规则:String类的==只有在右侧也是字符串、且字符内容完全一致时才会返回true。true是布尔类型对象,和空字符串既不属于同一类,内容也不可能相等,自然返回false。- 之前的if判断、
!!转布尔走的是独立的真值判定逻辑,这套逻辑只检查对象是不是false/nil,根本不会去判断对象和true/false是否相等。
可以用同样是真值的数字0做对照,逻辑完全一致:
if 0 puts "0是真值" # 这行一定会执行 end !!0 # => true 0 == true # => false
补充说明:和JS、Python这类存在隐式类型转换的语言不同,Ruby不会在相等判断时自动把其他类型转成布尔值,真值判定和值相等判断是完全独立的两套逻辑,不要混为一谈。
内容的提问来源于stack exchange,提问作者Lukas -.-
相关产品推荐
相关产品推荐

