探索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》
探索Scala(1)-- 运算符重载的更多相关文章
- scala学习手记7 - 运算符重载
从语法上来说scala是没有运算符的.之前的一节里也曾提到过scala的运算符实际上是方法名,如1 + 2实际上就是1.+(2).我们可以将之视为运算符,是因为scala的一个特性:如果方法的参数小于 ...
- C++ 运算符重载时,将运算符两边对象交换问题.
在C++进行运算符重载时, 一般来讲,运算符两边的对象的顺序是不能交换的. 比如下面的例子: #include <iostream> using namespace std; class ...
- C#高级编程笔记2016年10月12日 运算符重载
1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...
- C++运算符重载
C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...
- 标准C++之运算符重载和虚表指针
1 -> *运算符重载 //autoptr.cpp #include<iostream> #include<string> using namespace std ...
- python运算符重载
python运算符重载就是在解释器使用对象内置操作前,拦截该操作,使用自己写的重载方法. 重载方法:__init__为构造函数,__sub__为减法表达式 class Number: def __in ...
- PoEduo - C++阶段班【Po学校】-Lesson03-5_运算符重载- 第7天
PoEduo - Lesson03-5_运算符重载- 第7天 复习前面的知识点 空类会自动生成哪些默认函数 6个默认函数 1 构造 2 析构 3 赋值 4 拷贝构造 5 oper ...
- 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换
[源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...
- 我的c++学习(8)运算符重载和友元
运算符的重载,实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该运算符时就调用此函数来行使运算符功能.这个函数叫做运算符重载函数(常为类的成员函数). 方法与解释 ◆ 1.定义运 ...
随机推荐
- Yii/Yii2:查询返回以某特定列为索引(键)的数组
在Yii1.x中,要想查询语句返回以特定列为键(key)的数组数据,代码例如以下(下述样例以表主键为返回数组索引): $users = User::model()->findAll(array( ...
- siwft初学(一)
今天刚開始学习swift语言.首先须要下载xcode6 beta版本号.正式版本号然后会公布.自己学习总结一下,假设有误.请大家指出. 创建project的时候.language选择swift语言. ...
- USACO comehome Dijkstra
USER: Kevin Samuel [kevin_s1] TASK: comehome LANG: C++ Compiling... Compile: OK Executing... Test 1: ...
- 经典排序算法 - 高速排序Quick sort
经典排序算法 - 高速排序Quick sort 原理,通过一趟扫描将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整 ...
- [状压dp] hdu 4064 Carcassonne
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4064 Carcassonne Time Limit: 3000/1000 MS (Java/Othe ...
- LayoutInflater使用
在实际工作中,事先写好的布局文件往往不能满足我们的需求,有时会依据情况在代码中自己定义控件,这就须要用到LayoutInflater.LayoutInflater在Android中是“扩展”的意思,作 ...
- hdu 1429 胜利大逃亡(延续)(BFS+比特压缩)
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm& ...
- Linux/UNIX流程关系
流程关系 过程组 除了一个过程,每个过程ID此外.也属于一个进程组.过程基是一个或多个过程的集合. 通常它们与相同的作业相关联,它接受各种信号从相同终端. #include<unistd.h&g ...
- 采用truelicense进行Java规划license控制 扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址
采用truelicense进行Java规划license控制 扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址. Truelicense 它是一个开源java license ...
- Shell在大数据的魅力时代:从一点点思路百度大数据面试题
供Linux开发中的同学们,Shell这可以说是一个基本功. 对于同学们的操作和维护.Shell也可以说是一种必要的技能,Shell.对于Release Team,软件配置管理的同学来说.Shell也 ...