为什么Ruby只允许特定的运算符重载?

9
在 Ruby 中,就像在许多其他面向对象编程语言中一样,操作符是可以进行重载的。但是,只有特定的字符操作符可以被重载。
这个列表可能不完整,但以下是一些不能被重载的操作符:
!, not, &&, and, ||, or
5个回答

26

4
没问题。将 a && b 翻译为 a.&&(b) 的做法是不必要的,可以翻译为 a.&& { b }。代码块确实提供了惰性求值。 - Jörg W Mittag

13

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


1
正如Jorg在他的回答中提到的那样,!可以被覆盖。 - Andrew Grimm
我该如何覆盖“+=”方法?我该如何添加“++”方法? - Matrix

13

没错,运算符是不可重载的。只有方法可以。

有些运算符实际上并不是真正的运算符,它们只是方法的简写形式。因此,5 + 5 实际上是 5.+(5),而 foo[bar] = baz 实际上是 foo.[]=(bar, baz)


6
在Ruby 1.9中,!操作符实际上也是一个方法,可以被重载。这只留下了&&||以及它们的低优先级对应项andor
还有一些其他的“组合操作符”不能被重载,例如a != b实际上是!(a == b)a += b实际上是a = a+b

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

2

还有一个例子不能忘记,那就是<<

string = "test"
string << "ing"

等同于调用:

string.<<("ing")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接