大卫·A·布莱克他在书中指出:
[条件赋值运算符||=
,以及它很少被发现的
表弟 &&=,两者都提供与伪操作符方法相同的快捷方式,但基于操作符,即||
and &&
,您无法覆盖它。
为什么他特别提到我们不能覆盖||
and &&
?
与对象上的其他一些运算符不同,对象的行为在逻辑上可以依赖于类,布尔运算符是语言的一部分。当你有一个像这样的运算符时,==
,从逻辑上讲,该运算符的行为取决于对象的类型。字符串应逐个字符检查,哈希键值元组应逐个键值元组检查,等等。但是,&&
and ||
是基于语言的true 和 false 的定义,而不是任何特定于对象的东西。如果语言允许您覆盖这些运算符,则可能不存在一致的布尔模型,并且这些运算符将变得完全无用。
此外,还需要考虑性能。因为&&
and ||
are 短路操作员,这意味着如果第一个参数,比如说,&&
,评估为 false,第二个甚至从未被评估。和||
,如果第一个计算结果为 true,则永远不会计算第二个计算结果。如果您可以重写这些运算符,则此行为将不可能发生,就像在 Ruby 中运算符被重载为方法一样。根据定义,在调用方法之前必须评估所有参数。因此,短路运算符的性能提升和编程便利性都会丧失。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)