探索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.定义运 ...
随机推荐
- Android在发送带有附件的邮件
准备好工作了-下载最新的版本号JMail https://java.net/projects/javamail/pages/Home#Download_JavaMail_1.5.2_Release h ...
- 执行Sql块
import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import oracle.C ...
- petshop4.0 其中详细解释(系统架构)
前言:PetShop它是一个例子.微软用它来展示.Net容量企业系统开发.业界有很多.Net与J2EE争议.微软许多数据PetShop和Sun的PetStore从.这样的争论是不可避免的带有强烈的商业 ...
- BrowserSync使用
在Gulp中使用BrowserSync 2016-02-24 23:47 by 那时候的我, 116 阅读, 0 评论, 收藏, 编辑 博客已迁移至http://lwzhang.github.io. ...
- 检验身份证的正确性(Golang版本)
// CheckID_card project main.go package main /* * ai -> a1 , a2, a3, a4, a5, a6... a17 (a18 是校验码) ...
- Maximal Square 我们都在寻找最高1子矩阵(leeCode)
Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and ret ...
- HDU 4311 Meeting point-1 && HDU 4312 Meeting point-2
这俩个题 题意::给出N(<1e5)个点求找到一个点作为聚会的地方,使每个点到达这里的距离最小.4311是 曼哈顿距离 4312是 切比雪夫距离: 曼哈顿距离 :大家都知道 对于二维坐标系a( ...
- [Android]Can't create handler inside thread that has not called Looper.prepare()
更新是由于在新的线程来打开UI只有一个错误.子线程更新主线程UI需要使用Handler. 还有比如今天出现以下错误.码,如以下: send.setOnClickListener(new OnClick ...
- Python日志输出格式和时间格式
formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s","%Y%b%d-%H:%M:% ...
- ti8168 eth0 启动
ti8168 原始文件系统进去后没有网络eth0接口,为了有该接口须要配置/etc/network/interfaces 文件 详细配置例如以下(红色要配置) # /etc/network/inter ...