2013-06-23 110 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語句的條件將始終爲假。