在 Ruby 中,就像在许多其他面向对象编程语言中一样,操作符是可以进行重载的。但是,只有特定的字符操作符可以被重载。
这个列表可能不完整,但以下是一些不能被重载的操作符:
这个列表可能不完整,但以下是一些不能被重载的操作符:
!, not, &&, and, ||, or
!, not, &&, and, ||, or
方法可以进行重载,这些方法是语言语法的一部分。
!
可以被覆盖。 - Andrew Grimm没错,运算符是不可重载的。只有方法可以。
有些运算符实际上并不是真正的运算符,它们只是方法的简写形式。因此,5 + 5
实际上是 5.+(5)
,而 foo[bar] = baz
实际上是 foo.[]=(bar, baz)
。
!
操作符实际上也是一个方法,可以被重载。这只留下了&&
和||
以及它们的低优先级对应项and
和or
。a != b
实际上是!(a == b)
,a += b
实际上是a = a+b
。+=
方法,因为正如我在我的答案中已经解释的那样,根本没有 +=
运算符,因此也就不可能有相应的方法。++
不是有效的标识符,所以你需要使用反射来创建这样的方法:define_method(:'++') do |arg| puts "Hello from #{__callee__} with #{arg}" end; __send__(:'++', 42)
。 - Jörg W Mittag还有一个例子不能忘记,那就是<<
:
string = "test"
string << "ing"
等同于调用:
string.<<("ing")
a && b
翻译为a.&&(b)
的做法是不必要的,可以翻译为a.&& { b }
。代码块确实提供了惰性求值。 - Jörg W Mittag