官方扩展|| =条件赋值运算符

我想强调一下,我正在寻找Ruby 1.9.3解释器扩展||=运算符的实际方式,而不是基于其行为扩展它的方式。 我真正希望的是那些已经找到了实际翻译来源的人,这是我可能不满意的任务。 我发现的唯一资源似乎是检查这个问题已经过时了:“ 短路(|| =)边缘情况 ”。

我上面提到的资源似乎表明x ||= y的“官方”扩展到x = x || y 在1.9之前的解释器版本中, x = x || y要么是不准确的,要么是错误的。 在任何情况下,指示的边缘情况似乎已经平滑。 上面的资源声称x || x = y x || x = yx or x = y “更准确”。 但是,这两者都不正确,因为当x是以前未声明的全局变量时它们不起作用:

 [11:04:18][****@asha:~]$ irb 1.9.3-p194 :001 > a || a = 3 NameError: undefined local variable or method `a' for main:Object 1.9.3-p194 :002 > b or b = 3 NameError: undefined local variable or method `b' for main:Object 1.9.3-p194 :003 > c = c || 3 => 3 

所以在1.9.3中,至少x = x || y 就这些例子而言,扩展似乎是正确的。 但是,重申我原来的观点,我真的希望看到一些真正权威的消息来源解决这个问题,好吧,权威而不是像我(和其他人)所做的那样传闻。

编辑:这篇文章是关于规范,阅读评论,以获得一些不太理想的“实施故事”


Ruby草案规范(PDF)第11.4.2.3.2节对它进行了相当具体的定义(即使很难解释); 让我们做一个(理论上有点宽松)的例子,c || = 3;

a)将变量评估为变量参考(见11.5.4)。 设V为结果值。

V设置为c的值

b)评估operator-expression或方法调用 – 不带括号。 设W为结果值。

W设置为3

c)设OP为赋值运算符的赋值运算符名称。

OP设置为||

d)设X为V OP Wforms的运算符表达式。

X设置为c || 3 c || 3

e)让我成为abbreviated-variable-assignment-expression或abbreviated-variable-assignment-statement的变量。

我打算参考c

f)评估单变量赋值表达式(见11.4.2.2.2),其变量为I,运算符表达式为X.

c = c || 3 评估c = c || 3

g)缩写变量赋值的值是评估的结果值。

作业的结果是3

换句话说,扩展c = c || 3 c = c || 3是(排除1.9之前的错误)正确。

 x ||= y 

是一种简写forms

 x || x = y 

如果x不是n并且x不是false ,则由于||的短路评估,将进行分配 运营商。