gpt4 book ai didi

ruby - 如果||优先级高于=,那为什么 `a || a = b`起作用呢?

转载 作者:太空宇宙 更新时间:2023-11-03 17:36:38 28 4
gpt4 key购买 nike

我理解||or,或者&&and之间的区别,但是我不知道'明白是这样的:

考虑一个返回 @var 值的方法,或者在 @var 为 nil 时初始化它。

因为我有 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 中的某种魔法?

附言CoffeeScript 也有相同的行为。

更新/澄清:这个问题与短路评估无关。但是关于运算符优先级。请让我重新表述一下:

如果|| 的优先级高于=,那么为什么ruby 会看到一个|| a = b 作为 a || (a = b),但不是 (a || a) = b 并引发语法错误?

最佳答案

Ruby 使用所谓的 short-circuit evaluation评估这样的逻辑表达式。只有当第一个参数不足以计算表达式时,才会考虑第二个参数。

在您的示例中,自 @var最初是 nil ,表达式的后半部分被评估并设置为 MyClass.new 的实例.

这些表达式的扩展非常有趣。有几篇博文herehere很好地覆盖了它。

关于ruby - 如果||优先级高于=,那为什么 `a || a = b`起作用呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14674847/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com