任何人都可以点亮这个表达。似乎两者都是相同的,但它们不是。
a || a = b or a ||= b
和
a = a || b
如果
a = 4
和b = 6
,输出始终为4
这总是让我感到困惑和误解。有人可以解释一下吗?
答案 0 :(得分:10)
a || a = b
如果a
真实,查找a
,则返回a
,否则a = b
完成,即您将b
的值指定给{ {1}}。
a
这是一项任务操作。在这里,您要为a = a || b
分配值,而不管它具有什么价值。因此a
等于a
。在声明的第二部分,您正在寻找a || b
。如果它的值是真实的,那么您将其分配回a
本身,否则您将a
的值分配给b
。
<强> TL; DR 强>
a
正在为a = a || b
分配值(具体取决于条件),而不论其包含的值。
a
如果已经存在,则返回a ||= b
,否则a
用示例解释:
您可以将a = b
视为a || a = b
。现在我们假设a || (a = b)
和a = 4
。
由于按优先顺序,这是一个OR运算,由于OR的运算顺序是从左到右,我们从第一个b = 6
开始:
a
此 # lets call this Fig. 1
a || (a = b)
^
|
.
(here)
的值为4,这是一个真值。因此,评估将停止,然后返回a
。 (为什么?提示: 4
)
现在我们假设true || anything = true
和a = nil
。我们从同一个地方重新开始(图1)。由于b = 6
是a
,这在Ruby中是错误的,我们移动到OR操作的右侧,即nil
a = b
由于这是一项分配操作,它将被执行,我们最终会将 # lets call this Fig. 2
a || (a = b)
^
|
.
(here)
分配给6
。
回到a
。您可以将其视为a = a || b
。显然,按优先顺序进行赋值操作。由于分配操作的顺序是从右到左,因此首先评估a = (a || b)
。
(a || b)
如果 # lets call this Fig. 3
a = (a || b)
^
|
.
(here)
和a = 4
,b = 6
将返回a || b
(如上所述)。否则4
和a = nil
,b = 6
将返回a || b
。
现在,从此6
操作返回的任何值都会被分配到第一个||
。
a
答案 1 :(得分:4)
常见的误解是:
a ||= b
相当于a = a || b
,但其行为类似a || a = b
在a = a || b
中,a在每次运行时都由语句设置为某个值,而使用a || a = b
时,只有在逻辑上为假时才设置a(即如果它为nil或false) )因为 || 是短路&#39;。
让我保持简单:
也就是说,如果是||的左侧比较是真的,有 无需检查右侧。
更多参考RubyInside