提问人:Tony Pitale 提问时间:9/18/2008 最后编辑:Simone CarlettiTony Pitale 更新时间:10/8/2011 访问量:4699
为什么 Ruby 只允许某些运算符重载
Why Does Ruby Only Permit Certain Operator Overloading
问:
在 Ruby 中,就像在许多其他 OO 编程语言中一样,运算符是可重载的。但是,只有某些字符运算符可以重载。
此列表可能不完整,但以下是一些不能重载的运算符:
!, not, &&, and, ||, or
答:
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 && b
a.&&(b)
a.&& { b }
13赞
Jordi Bunster
9/18/2008
#3
是的。运算符不会过载。只有方法。
有些运营商并非如此。它们是方法的糖。所以真的,真的是。5 + 5
5.+(5)
foo[bar] = baz
foo.[]=(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 中,运算符实际上也是一个方法,可以被覆盖。这只留下 和 以及它们的低优先级对应项 和 。!
&&
||
and
or
还有一些其他的“组合运算符”不能被覆盖,例如 实际上,实际上就是.a != b
!(a == b)
a += b
a = 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)
上一个:常量成员函数的语义是什么?
评论