簡體   English   中英

是||即使第一個參數為真,運算符也會計算第二個參數?

[英]Does the || operator evaluate the second argument even if the first argument is true?

我正在嘗試評估表達式(a=10) || (rr=20) (a=10) || (rr=20)而rr變量未定義

所以在評估前一個表達式返回之前在ruby控制台中鍵入rr

rr
NameError: undefined local variable or method `rr' for main:Object
from (irb):1
from :0

當我寫表達式(a=10) || (rr=20) (a=10) || (rr=20)它返回10,當我寫rr后,它說nil

(a=10) || (rr=20)
rr  # => nil

那么,為什么會這樣呢? 不應該只在||的第二個參數定義rr 運算符被評估,應該永遠不會基於文檔?

發生這種情況是因為ruby解釋器在看到對它的賦值時(但在它執行實際的代碼行之前) 定義了一個變量。 您可以在此答案中閱讀更多相關信息。

布爾OR( || )表達式將計算為左手表達式的值,如果它不是nil而不是false ,否則為|| 將評估右手表達的價值。

在您的示例中,ruby解釋器看到對arr的賦值(但它還沒有執行此行),並使用nil初始化(定義,創建) arr 然后它執行|| 表達。 在這|| 表達式, a被賦值為10 ,返回10 不評估r=20 ,並且rr沒有改變(它仍然是nil )。 這就是為什么在下一行rrnil

正如@DOC所說, &&|| 被稱為short circuited條件運算符。

In case of ||, if the left part of || expression returns true, the right part won't be executed. 這意味着只有在||的左側部分才會執行正確的部分 表達式返回false。

In case of &&, right part of the expression will be executed only if left part of && returns true. && expression will be executed only if left part of && returns true. In case of &&, right part of the expression will be executed only if left part of && returns true.

在給定的場景中(a=10) || (rr=20) (a=10) || (rr=20) ,由於ruby表達式a=10返回true因此不會執行rr = 20。 請注意,在ruby賦值表達式中,除了nil and false之外nil and false返回true。

我認為變量定義發生在解析階段,而不是執行時刻。 因此,當它評估該行時,它會解析整個事物並定義變量,但是未分配。

當解析器發現變量時,它在其定義的上下文中自動有效。自行評估rr無效。 即使從不發生值賦值,評估rr=20也足以導致定義。

這是Ruby如何嘗試辨別變量和方法調用的一個怪癖。 它不完美但通常效果最好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM