探索Scala(1)-- 运算符重载
来源:互联网 发布:sql server count 1 编辑:程序博客网 时间:2024/06/04 18:29
Scala语言运算符重载完全是语法层面的小把戏,本文记录我对Scala语言运算符重载的一些理解。
方法调用语法糖
调用方法时,Scala允许省略点号和圆括号,如下面代码所示:
把运算符映射成单词
对于Scala来说,运算符和普通的方法没什么两样。比如下面这个类就重载了加号和减号:
我们可以这样使用MyInt:
var myInt = new MyInt(1)myInt = myInt + 1用javap或者classpy分析一下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》
- 探索Scala(1)-- 运算符重载
- 【C++的探索路7】运算符重载的基本概念与赋值运算符重载
- Groovy探索之运算符的重载 一
- Groovy探索之运算符的重载 二
- 运算符重载1
- 运算符重载1
- 运算符重载(1)
- 运算符重载(++ --)
- 运算符(<<, >>)重载
- ()运算符重载
- scala(6)-----运算符
- c++运算符重载(1)
- 分数中的运算符重载(1)
- 运算符重载(C++)1
- 利用C++、scala等语言的运算符重载功能定制领域特定语言(DSL,Domain-Specific Language )
- 高精度运算(运算符重载)
- Time类中的运算符重载(1)-二目的比较运算符重载
- C++重载运算符(一)如何重载运算符
- 配置Erlang Shell 启动时自动切换工作目录
- java面向对象(三) 构造方法
- Oracle大数据常见优化查询
- MVC3.0在各个版本IIS中的部署
- 黑马程序员——java基础知识总结(一)
- 探索Scala(1)-- 运算符重载
- PV、UV、VV、IP的含义
- android学习计划
- JQuery合并相邻单元格
- ArcSDE 用法
- js中的undefined 和 null, NaN
- Guava-base接口|Ascii|CharMatcher
- maven生命周期
- 开发规范常用项