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

时间:2013-03-09 13:41:35

标签: ruby keyword

David A. Black 在他的书中说:

  

[T]他是条件赋值运算符||=,以及它很少被发现   cousin&& =,两者都提供与伪操作符方法相同的快捷方式,但基于运算符,即||&&,您无法覆盖。

他为什么特别提到我们无法覆盖||&&

1 个答案:

答案 0 :(得分:12)

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

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