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

Why Does Ruby Only Permit Certain Operator Overloading

提问人:Tony Pitale 提问时间:9/18/2008 最后编辑:Simone CarlettiTony Pitale 更新时间:10/8/2011 访问量:4699

问:

在 Ruby 中,就像在许多其他 OO 编程语言中一样,运算符是可重载的。但是,只有某些字符运算符可以重载。

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

!, not, &&, and, ||, or
Ruby 方法 算符运算 符重载

评论


答:

13赞 Farrel 9/18/2008 #1

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

评论

1赞 Andrew Grimm 10/10/2011
正如 Jorg 在他的回答中提到的,可以被覆盖。!
0赞 Matrix 4/26/2018
如何覆盖“+=”方法?以及如何添加“++”方法?
26赞 Joe Van Dyk 9/18/2008 #2

“&& 和 ||算子不会过载,主要是因为它们提供了无法用纯方法调用重现的“短路”评估。

——吉姆·韦里奇

评论

4赞 Jörg W Mittag 10/10/2011
实际上,这不是问题。您可以将其翻译成 ,而不是翻译成 。块确实提供了延迟评估。a && ba.&&(b)a.&& { b }
13赞 Jordi Bunster 9/18/2008 #3

是的。运算符不会过载。只有方法。

有些运营商并非如此。它们是方法的糖。所以真的,真的是。5 + 55.+(5)foo[bar] = bazfoo.[]=(bar, baz)

2赞 Ryan Bigg 9/19/2008 #4

例如,我们不要忘记:<<

string = "test"
string << "ing"

等同于调用:

string.<<("ing")
6赞 Jörg W Mittag 9/21/2008 #5

在 Ruby 1.9 中,运算符实际上也是一个方法,可以被覆盖。这只留下 和 以及它们的低优先级对应项 和 。!&&||andor

还有一些其他的“组合运算符”不能被覆盖,例如 实际上,实际上就是.a != b!(a == b)a += ba = a+b

评论

0赞 Matrix 4/26/2018
如何覆盖“+=”方法?以及如何添加“++”方法?
0赞 Jörg W Mittag 4/27/2018
你不能覆盖该方法,因为正如我在回答中已经解释的那样,没有运算符,因此不可能有相应的方法。 不是有效的标识符,因此需要使用 reflection 来创建这样的方法:。+=+=++define_method(:'++') do |arg| puts "Hello from #{__callee__} with #{arg}" end; __send__(:'++', 42)