David A. Black 在他的书中说:
[T]他是条件赋值运算符
||=
,以及它很少被发现 cousin&& =,两者都提供与伪操作符方法相同的快捷方式,但基于运算符,即||
和&&
,您无法覆盖。
他为什么特别提到我们无法覆盖||
和&&
?
答案 0 :(得分:12)
与对象上的其他运算符不同,它的行为逻辑上可以依赖于类,布尔运算符是语言的一部分。当你有一个像==
这样的运算符时,可以合理地说这个运算符的行为取决于对象的类型。字符串应该逐字符检查,键值元组的哈希键值元组等等。但是,&&
和||
的行为基于语言的定义true和false,而不是任何特定于对象的。如果语言允许您覆盖这些运算符,则可能没有一致的布尔模型,并且这些运算符将变得完全无用。
此外,还有一个性能考虑因素。因为&&
和||
是短圈运算符,这意味着如果第一个参数,例如&&
,评估为false,则第二个参数永远不会甚至评估。使用||
,如果第一个计算结果为true,则从不评估第二个。如果您可以覆盖这些运算符,则无法执行此行为,因为Ruby运算符会作为方法重载。在调用方法之前,必须根据定义评估所有参数。因此,失去了性能提升和短路操作器的编程便利性。