||= 和 |= 与布尔值之间的区别是什么

Whats the dfference between ||= and |= with booleans

我知道 a ||= b 的行为类似于 a || a = b,而 a |= b 的行为类似于 a = a | b

在使用布尔值时,使用哪种会有所不同吗?我认为唯一的实际区别是如果 ab 为真,||= 将不会分配,这是唯一的区别吗?

Oring 如果任何语句是 true 则完成的语句将仅 return true。 类似地,当 Anding 如果任何语句是 false 则完成的语句将仅 return false

||| 之间的主要区别是当 || 的第一条语句是 truthy 时,其他语句不执行。而 | 将执行所有语句,即使第一个语句是 truthy.

考虑以下 ||

的示例
2.6.5 :001 > a = 4
 => 4
2.6.5 :002 > a ||= (b = 9) # same as a = 4 || 9
 => 4
2.6.5 :003 > a
 => 4
2.6.5 :004 > b
 => nil

| 的示例(对于 int | other_int 它将执行 bitwise OR ref

2.6.5 :005 > c = 6
 => 6
2.6.5 :006 > c |= (d = 8) # same as a = 0110 || 1110
 => 14
2.6.5 :007 > c
 => 14
2.6.5 :008 > d
 => 8

对于布尔值 ||

示例
2.6.5 :001 > a = true
 => true
2.6.5 :002 > a ||= (b = false)
 => true
2.6.5 :003 > a
 => true
2.6.5 :004 > b
 => nil

|

的示例
2.6.5 :005 > c = true
 => true
2.6.5 :006 > c |= (d = false)
 => true
2.6.5 :007 > c
 => true
2.6.5 :008 > d
 => false

不太正确。通常,X= 运算符的行为类似于 A = A X B,其中 X 是受支持的运算符之一。值得注意的是,它始终位于 =.

的右侧

也就是说,||| 是两个 非常 不同的运算符。 | 版本通常被理解为执行 二进制数学 ,如:

2 | 1
# => 3

这是 0b100b01 与二进制 OR 组合的结果。

它也做数组联合:

[ 1, 2 ] | [ 2, 3 ]
# => [ 1, 2, 3 ]

|| 对值的 真实性 进行更高级别的逻辑测试。在Ruby中只有nilfalse被认为是non-truthful,所有其他值被认为是真实,所以:

0 || 1
# => 0
false || true
# => true
nil || "yes"
# => "yes"

同样的原则适用于&&&

有趣的是 |& 是方法调用,它们的实际功能取决于运算符左侧的内容,而 ||&& 是语法元素你无法改变,总是以同样的方式工作。

那么 |=||= 在哪里发挥作用呢?在某些情况下您会看到它们。

设置位标志:

flags |= 0b0010

应用默认值:

max ||= MAX_DEFAULT