gpt4 book ai didi

ruby - 为什么我们不能覆盖 `||` 和 `&&` ?

转载 作者:数据小太阳 更新时间:2023-10-29 06:46:28 25 4
gpt4 key购买 nike

David A. Black 在他的书中说:

[T]he conditional assignment operator ||=, as well as its rarely spotted cousin &&=, both of which provide the same kind of shortcut as the pseudooperator methods but are based on operators, namely || and &&, which you can’t override.

为什么他特别提到我们不能覆盖||&&

最佳答案

与对象上的一些其他运算符不同,对象的行为在逻辑上可以取决于类, bool 运算符是语言的一部分。当你有一个像 == 这样的运算符时,可以说这个运算符的行为取决于对象的类型是合乎逻辑的。一个字符串应该一个字符一个字符地检查,一个哈希键值元组一个键值元组等等。但是,&&|| 的行为是基于 < em>语言的 对真假的定义,而不是任何特定于对象的定义。如果该语言允许您覆盖这些运算符,则可能没有一致的 bool 模型,并且这些运算符将变得完全无用。

此外,还有性能方面的考虑。因为 &&||短路运算符,这意味着如果第一个参数是 && , 评估为假,第二个甚至从未评估过。对于 ||,如果第一个计算结果为真,则永远不会计算第二个。如果您可以覆盖这些运算符,就不可能出现这种行为,因为在 Ruby 中,运算符被重载为方法。根据定义,必须在调用方法之前评估所有参数。因此,短路运算符的性能提升和编程便利性都丧失了。

关于ruby - 为什么我们不能覆盖 `||` 和 `&&` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15311349/

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