为什么Ruby只允许某些运算符重载

Ton*_*ale 8 ruby methods operator-overloading operators

在Ruby中,与许多其他OO编程语言一样,运算符是可重载的.但是,只有某些字符运算符可能会过载.

此列表可能不完整,但是,以下是一些无法重载的运算符:

!, not, &&, and, ||, or
Run Code Online (Sandbox Code Playgroud)

Joe*_*Dyk 25

"&&和||运算符不可重载,主要是因为它们提供的"短路"评估无法通过纯方法调用再现."

- Jim Weirich

  • 实际上,这不是问题.而不是将`a && b`翻译成`a.&&(b)`,你可以把它翻译成`a.&& {b}`.Blocks*do*提供惰性评估. (4认同)

Jor*_*ter 12

是的.操作员不会过载.只有方法.

有些运营商并非如此.他们是方法的糖.所以5 + 5真的5.+(5),而且foo[bar] = baz确实如此foo.[]=(bar, baz).


Far*_*rel 11

方法是可重载的,这些是语言语法的一部分.


Jör*_*tag 6

在Ruby 1.9中,!运算符实际上也是一种方法,可以被覆盖.这只留下&&||他们的低优先级对应物andor.

还有一些其他"组合运算符"无法覆盖,例如a != b实际上!(a == b)并且a += b实际上是a = a+b.