[英]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解釋器看到對a
和rr
的賦值(但它還沒有執行此行),並使用nil
初始化(定義,創建) a
和rr
。 然后它執行||
表達。 在這||
表達式, a
被賦值為10
,返回10
。 不評估r=20
,並且rr
沒有改變(它仍然是nil
)。 這就是為什么在下一行rr
是nil
。
正如@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.