2013-06-23 108 views
0

为什么不同的这些表情:逻辑等效字符串比较

!x == "string" 

x != "string" 

至少第一表达不进我的if,当我改变它,执行if代码。

+2

你认为'!x ==“string”'做什么?提示:运算符优先级 –

+0

我假设你想'if!(x ==“string”)'。考虑使用'除非x ==“string”'代替。 –

回答

-2

在le AST第一个表达式不进入我如果

这里是我的解释:

!具有更高的优先级,然后==。因此,在表达式!x == "string"将在内部表示为(!x) == "string"

!x要么将​​被evaluted到truefalse,分别TrueClassFalseClass对象。现在我们来看看truefalse对象使用哪个方法的#==方法。

true.method(:==).owner 
# => BasicObject 
false.method(:==).owner 
# => BasicObject 

Basic#==:平等 - 在对象级别,==返回true仅如果obj等是同一个对象。

根据上述定义,您的代码!x == "string"应始终评估为false

+0

downvote的不是我的 –

+0

@JanDvorak Opps !!对不起..打扰你然后.. :))请不要介意..让我,如果有任何进一步的改善是需要这个答案。 –

+0

是一个很长的答案,我会标记这个,不想让我的错误来惩罚你。 – juanpastas

7

比方说,x是 “富”

!x == "string" 

扩大到

false == "string" 

这是你的第二个例子,这是扩展到完全不同的:

"foo" != "string" 
+2

可能值得注意的是,这是因为'!x ==“字符串”'等效于'(!x)==“字符串”'而不是'!(x ==“string”)'。 –

+0

@AndrewMarshall你是对的... –

2

你认为“不是x”是什么?它会等于“字符串”还是任何字符串?

这完全是一个完全不同的陈述。

您提到了一个if语句,所以这必须是您用于逻辑语句的条件。既然x不会等于一个字符串,那么if语句的条件将始终为假。