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)-- 运算符重载的更多相关文章

  1. scala学习手记7 - 运算符重载

    从语法上来说scala是没有运算符的.之前的一节里也曾提到过scala的运算符实际上是方法名,如1 + 2实际上就是1.+(2).我们可以将之视为运算符,是因为scala的一个特性:如果方法的参数小于 ...

  2. C++ 运算符重载时,将运算符两边对象交换问题.

    在C++进行运算符重载时, 一般来讲,运算符两边的对象的顺序是不能交换的. 比如下面的例子: #include <iostream> using namespace std; class ...

  3. C#高级编程笔记2016年10月12日 运算符重载

    1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...

  4. C++运算符重载

    C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...

  5. 标准C++之运算符重载和虚表指针

    1 -> *运算符重载 //autoptr.cpp     #include<iostream> #include<string> using namespace std ...

  6. python运算符重载

    python运算符重载就是在解释器使用对象内置操作前,拦截该操作,使用自己写的重载方法. 重载方法:__init__为构造函数,__sub__为减法表达式 class Number: def __in ...

  7. PoEduo - C++阶段班【Po学校】-Lesson03-5_运算符重载- 第7天

    PoEduo - Lesson03-5_运算符重载- 第7天 复习前面的知识点 空类会自动生成哪些默认函数 6个默认函数    1  构造  2  析构   3  赋值  4 拷贝构造  5 oper ...

  8. 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换

    [源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...

  9. 我的c++学习(8)运算符重载和友元

    运算符的重载,实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该运算符时就调用此函数来行使运算符功能.这个函数叫做运算符重载函数(常为类的成员函数). 方法与解释 ◆ 1.定义运 ...

随机推荐

  1. 《炉石传说》建筑设计欣赏(7):采用Google.ProtocolBuffers处理网络消息

    这一次,琢磨了一下Unity3D网络游戏发展的网络信息处理.服务器的网络游戏一般都是自主研发,因此,相应的网络消息处理应该培养自己.client/现在使用的邮件服务器之间的价差JSON和Google. ...

  2. bnu1066

    hnu1066 给我们一张图,问我们摧毁边使得s和t不连通有多少种方案, 方案与方案之间不能存在相同的摧毁目标. 这是一个神奇的题目. 这题可以转为求s与t的最短路,为什么呢? 因为方案与方案之间不能 ...

  3. Android_declare-styleable_自己定义控件的属性

    1.简单实例 (1).在res/values文件下定义一个attrs.xml文件 <? xml version="1.0" encoding="utf-8" ...

  4. MFC漆摘要-截图,获得DIB/DDB图形Pixel

    1.       当前Screen进行Copy屏幕,获得BITMAP 当前屏幕Copy.须要获取当前屏幕的HDC, 一种是直接从屏幕DC抓原始图. 一种是然后使用兼容MemDC进行抓图,然后能够附加图 ...

  5. CSS预处理器——Sass、LESS和Stylus实践

    CSS(Cascading Style Sheet)被译为级联样式表,做为一名前端从业人员来说,这个专业名词并不陌生,在行业中通常称之为“风格样式表(Style Sheet)”,它主要是用来进行网页风 ...

  6. 【NO.3】 c program to caculate and display sum of two matrix

    source code: #include "stdafx.h" /* display sum of two matrix*/ int _tmain(int argc, _TCHA ...

  7. composite template 组合模式

      1. 主要优点 组合模式的主要优点如下: (1) 组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制. (2) 客户端可以一致 ...

  8. Blend4精选案例图解教程(二):找张图片玩特效

    原文:Blend4精选案例图解教程(二):找张图片玩特效 Blend中的特效给了我们在处理资源时更多的想象空间,合理地运用特效往往会得到梦幻般效果,本次教程展示对图片应用特效的常规操作,当然特效不仅限 ...

  9. android存储阵列数据SharedPreferences

    假设要数组数据(如boolean[] .int[]等)到SharedPreferences时,我们能够先将数组数据组织成json数据存储到SharedPreferences,读取时则对json数据进行 ...

  10. html 格式的email 编辑

    本篇文章只讲如何编辑html格式的email 模板,并不讲述如何用程序发送email. 1.做email的重要思想:“复古” 抛弃现代化的div+css技术,回到html4.0+table的时代.少用 ...