You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
重载运算符的设计
重载运算符所考虑的问题
对于重载运算符来说,一般需要考虑:
运算符符号是什么
++++
multiplus
支持的运算符种类
+1
。一般有+-!&*
。1+1
。"{}"json
。f(a)
。一般有apply()
和get[]
。支持重载的运算符是否有限
同时与重载运算符相结合的特性一般有:
object.f(a)
写成object f a
。f(a)
写成f a
。f(a)
写成f a
。在左结合的情况下,多参数函数可以写成f a b c
object.f()
写成f(object)
,把成员函数转变为全局函数使用。其中成员函数中缀与函数的柯里化以及统一函数调用是矛盾的。
**运算符的优先级问题。**如果要在语法分析阶段完成运算符优先级的处理的话,只能重载有限的符号,或者采取有限符号有优先级+无限符号按函数的优先级处理的方式,或者用已有符号作为优先级标识。
一些现成语言的方案
kotlin的方案是,可以重载有限个符号运算符,支持无限个变量名当中缀
cpp的方案是,可以重载有限个符号运算符,支持无限个变量名当字面量的后缀。(只支持unsigned long long和char[]类型有字面量后缀。)
scala的方案是,可以无限个符号与变量运算符当中缀,有限个符号运算符当前缀。当一个运算符符号名称(如
++++
)使用多个运算符时,将根据运算符的第一个字符来评估优先级1 。groovy的方案是,支持单参数函数调用不带括号当前缀,有限个符号运算符当中缀
目前设想的方案
+++
与加号优先级一致;或者根据最后一个字符的优先级,例如+++*
与乘号优先级一致),没有中缀变量名运算符,(成员函数单参数调用时省略括号,但是不能省略点)举一个例子:
Footnotes
https://docs.scala-lang.org/zh-cn/tour/operators.html scala docs ↩
Beta Was this translation helpful? Give feedback.
All reactions