||
我理解and or
, or &&
and之间的区别and
,但我不明白的是:
考虑一个返回 的值的方法,或者如果为 false 为 nil@var
则初始化它。@var
由于我来自 JavaScript 背景,我会这样写,因为||
它的优先级高于=
:
def some_method
@var || (@var = MyClass.new)
end
或使用or
,因为or
优先级较低:
def some_method
@var or @var = MyClass.new
end
或更简洁地说:
def some_method
@var ||= MyClass.new
end
但碰巧这个版本也有效:
def some_method
@var || @var = MyClass.new
end
我在网上搜索,但没有找到有用的结果。
他们中的大多数只是说出和之间的||
区别or
。
运算符优先级表清楚地表明||
具有比 更高的优先级=
。
我什至可以做到a = b || c = d
,而 Ruby 将其视为a = (b || (c = d))
.
这种行为是记录在某处还是 Ruby 中的某种魔法?
PS CoffeeScript 也有同样的行为。
更新/澄清:这个问题与短路评估无关。但是关于运算符优先级。请让我重新表述一下:
如果||
优先级高于=
,那么为什么 ruby 会看到a || a = b
as a || (a = b)
,而不是看到(a || a) = b
并引发语法错误?