是|| 即使第一个参数为真,运算符也会计算第二个参数?

zea*_*uss 10 ruby irb

我正在尝试在(a=10) || (rr=20)没有定义rr变量的情况下评估表达式

所以rr在评估前一个表达式返回之前输入ruby控制台

rr
NameError: undefined local variable or method `rr' for main:Object
from (irb):1
from :0
Run Code Online (Sandbox Code Playgroud)

当我写表达式时,(a=10) || (rr=20)它返回10,当我写rr后,它说nil

(a=10) || (rr=20)
rr  # => nil
Run Code Online (Sandbox Code Playgroud)

那么,为什么会这样呢?不应该只在||的第二个参数定义rr 运算符被评估,应该永远不会基于文档?

Ali*_*kau 11

发生这种情况是因为ruby解释器在看到对它的赋值时(但在它执行实际的代码行之前)定义了一个变量.您可以在此答案中阅读更多相关信息.

||如果nil不是false,则布尔OR()表达式将计算为左手表达式的值,否则||将计算为右手表达式的值.

在你的例子中,ruby解释器看到一个赋值给arr(但它还没有执行这一行),并初始化(定义,创建)arr使用nil.然后它执行||表达式.在此||表达式中,a分配给1010返回.r=20未评估,并且rr未更改(它仍然是nil).这就是下一行的rr原因nil.


nkm*_*nkm 5

正如@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.

在给定的场景中,由于 ruby​​ 表达式返回,(a=10) || (rr=20)因此 rr=20 将不会被执行。请注意,在 ruby​​ 中,赋值表达式返回 true except 。a=10truenil and false