博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
探索Scala(1)-- 运算符重载
阅读量:5098 次
发布时间:2019-06-13

本文共 1660 字,大约阅读时间需要 5 分钟。

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

方法调用语法糖

调用方法时,Scala同意省略点号圆括号,如以下代码所看到的:

把运算符映射成单词

对于Scala来说,运算符和普通的方法没什么两样。比方以下这个类就重载了加号减号

我们能够这样使用MyInt:

var myInt = new MyInt(1)myInt = myInt + 1
用 或者 分析一下scalac编译之后的类能够知道,+实际上被编译成了
$plus()方法,-被编译成了
$minus()方法。也就是说,以下三行代码全然等价:

myInt = myInt + 1myInt = 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) // -1println(!myInt) // 99println(~myInt)

圆括号语法糖

假设一个类定义了apply()方法,那么Scala提供了语法糖,让该类的实例看起来像是函数(能够直接调用)或数组(能够按下标訪问元素)。假设类定义了update()方法,那么就能够像数组那样按下标赋值。比方以下的Pair类:

能够像以下这样使用Pair类:

val xy = new Pair(Array(3, 7))println(xy(0)) // 3println(xy(1)) // 7xy(0) = 11xy(1) = 18println(xy(0)) // 11println(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》

转载于:https://www.cnblogs.com/mfrbuaa/p/4070990.html

你可能感兴趣的文章
Hibernate -- Session的主键生成策略
查看>>
Oracle 分页
查看>>
LINUX - getopts
查看>>
【CJOJ1644】【洛谷2758】编辑距离
查看>>
基于SAAJ的客户端
查看>>
maven将依赖第三方包打包(package)到jar中
查看>>
Python selenium —— 父子、兄弟、相邻节点定位方式详解
查看>>
Hadoop简介
查看>>
linux文件系统挂载
查看>>
Python list替换元素
查看>>
SQL Server 优化存储过程的七种方法 (转)
查看>>
设计模式(十一)外观模式(Facade Pattern)
查看>>
JS里charCodeAt()和fromCharCode()方法拓展应用:加密与解密
查看>>
查看SQLServer的QUOTED_IDENTIFIER等配置
查看>>
[转]构建基于WCF Restful Service的服务
查看>>
数据访问
查看>>
php基础知识测试总结
查看>>
Apache Cordova
查看>>
java随笔一(关于定时任务)
查看>>
Codeforces 975D Ghosts 【math】
查看>>