探索Scala(1)-- 运算符重载

Scala语言运算符重载全然是语法层面的小把戏,本文记录我对Scala语言运算符重载的一些理解。

方法调用语法糖

调用方法时,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运算符,可是没有重载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)


一元运算符

仅仅有四种运算符能够被定义为一元(Unary)运算符,它们是:+、-、!、~,如以下代码所看到的:

以下是演示样例代码:

val myInt = new MyInt(1)
println(-myInt) // -1
println(!myInt) // 99
println(~myInt)

圆括号语法糖

假设一个类定义了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

《Programming in Scala》第二版

《Scala for the Impatient》


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值