为什么这些表达方式不同:
!x == "string"
和
x != "string"
至少第一个表达式不会进入我的if
,当我更改它时,会执行if
个代码。
答案 0 :(得分:7)
假设x是“foo”
!x == "string"
扩展为
false == "string"
与您的第二个示例完全不同,后者扩展为:
"foo" != "string"
答案 1 :(得分:2)
你期望“不是x”是什么?是否等于“string”或任何字符串?
这只是一个完全不同的陈述。
你提到了一个if语句,所以这必须是你用于逻辑语句的条件。由于x不会等于字符串,因此if语句条件将始终为false。
答案 2 :(得分:-2)
至少第一个表达式不会进入我的
以下是我的解释:
!
的优先级高于==
。因此,在您的表达式中!x == "string"
将在内部表示为(!x) == "string"
!x
将评估为true
或false
,分别为TrueClass
或FalseClass
个对象。现在让我们检查#==
和true
对象使用的false
方法。
true.method(:==).owner
# => BasicObject
false.method(:==).owner
# => BasicObject
Basic#==
:Equality - 在Object级别,只有当obj和other是同一个对象时,==才返回true。
根据上述定义,您的代码!x == "string"
应始终评估为false
。