||之间的区别a = b和a = a || b红宝石?

时间:2015-05-29 08:13:12

标签: ruby

任何人都可以点亮这个表达。似乎两者都是相同的,但它们不是。

a || a = b or a ||= b

a = a || b

如果

a = 4b = 6,输出始终为4

这总是让我感到困惑和误解。有人可以解释一下吗?

2 个答案:

答案 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 = truea = nil。我们从同一个地方重新开始(图1)。由于b = 6a,这在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 = 4b = 6将返回a || b (如上所述)。否则4a = nilb = 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

相关问题