标签:scala
对于Scala来说,运算符就是普通的方法(再配上一些语法糖)。比如下面这个类就重载了加号和减号:
我们可以这样使用MyInt:
var myInt = new MyInt(1) myInt = myInt + 1用javap或者classpy分析一下scalac编译之后的类可以知道,+实际上对应$plus()方法,-对应$minus()方法。也就是说,下面三行代码完全等价:
myInt = myInt + 1 myInt = myInt.+(1) myInt = myInt.$plus(1)
多符号运算符无非就是单个运算符的简单组合而已,给MyInt添加一个多符号运算符+++,如下所示:
那么可以这样使用+++:
var myInt = new MyInt(1) myInt = myInt +++ 1反编译MyInt.class可以知道,scalac把+++运算符编译成了$plus$plus$plus()方法。
如果一个类重载了op运算符,但是没有重载op=,那么Scala编译器会把x op= y替换为x = x op y,也就是x = x.op(y),代码如下所示:
var myInt = new MyInt(1) myInt += 1 // myInt = myInt + 1
如果运算符以冒号结束,那么运算符会绑定(bind)到右边的操作数,也就是说,x op: y等价于y.op:(x)。我们给MyInt增加一个+:运算符,如下所示:
那么可以这样使用+:运算符:
var myInt = new MyInt(1) println(1 +: myInt) // myInt.+:(1)
如果一个类定义了apply()方法,那么Scala提供了语法糖,让该类的实例看起来像是函数(可以直接调用)或数组(可以按下标访问元素)。如果类定义了update()方法,那么就可以像数组那样按下标赋值。比如下面的Pair类:
可以像下面这样使用Pair类:
val xy = new Pair(Array(3, 7)) println(xy(0)) // 3 println(xy(1)) // 7 xy(0) = 11 xy(1) = 18 println(xy(0)) // 11 println(xy(1)) // 18
下面是我整理出来的运算符和Scala内部名称的对照表:
+ | $plus |
- | $minus |
* | $times |
/ | $div |
% | $percent |
& | $amp |
| | $bar |
^ | $up |
~ | $tilde |
> | $greater |
< | $less |
! | $bang |
? | $qmark |
= | $eq |
: | $colon |
@ | $at |
# | $hash |
\ | $bslash |
$ | $ |
http://www.scala-lang.org/documentation/
http://stackoverflow.com/questions/7888944/scala-punctuation-aka-symbols-and-operators
标签:scala
原文地址:http://blog.csdn.net/zxhoo/article/details/40074195