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

David A. Black在他的书中说:

[T]条件赋值运算符||= ,以及它很少发现的表兄&& =,它们都提供与伪运算符方法相同的快捷方式但基于运算符,即||&& ,你无法覆盖。

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

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

此外,还有一个性能考虑因素。 因为&&||短循环运算符 ,这意味着如果第一个参数,例如&& ,计算结果为false,则第二个参数永远不会被评估。 随着|| ,如果第一个评估为真,则从不评估第二个。 如果您可以覆盖这些运算符,则无法执行此行为,因为Ruby运算符会作为方法重载。 在调用方法之前,必须根据定义评估所有参数。 因此,失去了性能提升和短路操作器的编程便利性。