Scala学习笔记(1)-- 运算符重载

本文记录我对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)

圆括号语法糖

如果一个类定义了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

时间: 2024-08-03 10:40:02

Scala学习笔记(1)-- 运算符重载的相关文章

C++ Primer Plus学习笔记之运算符重载

C++ Primer Plus学习笔记之运算符重载 1,成员函数和友元函数选择的建议 下面我们先看两个例子: 成员函数重载 #include<iostream> using namespace std; class Complex { public: Complex(double r=0,double i=0) { re=r; im=i; } Complex operator+(const Complex& obj); Complex operator!(); void Display

C++学习笔记之运算符重载

一.运算符重载基本知识 在前面的一篇博文 C++学习笔记之模板(1)——从函数重载到函数模板 中,介绍了函数重载的概念,定义及用法,函数重载(也被称之为函数多态)就是使用户能够定义多个名称相同但特征标(参数列表)不同的函数,目的是在对不同类型的参数执行相同的操作时只用一个同名的函数. 运算符重载,就是使同一个运算符在面临不同类型的数据时作出不同的操作(函数重载是操作相同),就是让同一个运算符有多重功能.实际上我们经常用的许多运算符已被重载,例如,将*用于地址,将得到存储在这个地址中的值:但将它用

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

从语法上来说scala是没有运算符的.之前的一节里也曾提到过scala的运算符实际上是方法名,如1 + 2实际上就是1.+(2).我们可以将之视为运算符,是因为scala的一个特性:如果方法的参数小于等于1个的话,那么"."和括号就都是可选的. scala的运算符重载指的就是重载+.-这样的符号--和C.java或者python等语言不一样,我们需要自己定义这些符号如何实现. 下面看一个"+"运算符实现的例子.这里定义了一个Complex类,Complex指的是复数

PKU C++程序设计实习 学习笔记4 运算符重载

第四章 运算符重载 4.1 运算符重载的基本概念 1. 运算符 2. 自定义数据类型与运算符重载 C++提供了数据抽象的手段:用户自己定义数据类型 -- 类 ? 调用类的成员函数->操作它的对象 类的成员函数->操作对象时,很不方便 ? 在数学上,两个复数可以直接进行+/-等运算 Vs. 在C++中,直接将+或-用于复数是不允许的 3. 运算符重载 对抽象数据类型也能够直接使用C++提供的运算符 ? 程序更简洁 ? 代码更容易理解 运算符重载 ? 对已有的运算符赋予多重的含义 ? 使同一运算符

C++ Primer 学习笔记_27_操作符重载与转换(2)--++/--运算符重载、!运算符重载、赋值运算符重载 、String类([]、 +、 += 运算符重载)、&gt;&gt;和&lt;&lt;运算符重载

C++ Primer 学习笔记_27_操作符重载与转换(2)--++/--运算符重载.!运算符重载.赋值运算符重载 .String类([]. +. += 运算符重载).>>和<<运算符重载 一.++/--运算符重载 1.前置++运算符重载 成员函数的方式重载,原型为: 函数类型 & operator++(); 友元函数的方式重载,原型为: friend 函数类型 & operator++(类类型 &); 2.后置++运算符重载 成员函数的方式重载,原型为:

C++ Primer 学习笔记_28_操作符重载与转换(3)--成员函数的重载、覆盖与隐藏、类型转换运算符、*运算符重载、-&gt;运算符重载

C++ Primer 学习笔记_28_操作符重载与转换(3)--成员函数的重载.覆盖与隐藏.类型转换运算符.*运算符重载.->运算符重载 一.成员函数的重载.覆盖与隐藏 对于类层次的同名成员函数来说,有三种关系:重载.覆盖和隐藏,理清3种关系,有助于写出高质量的代码. 1.成员函数的重载 重载的概念相对简单,只有在同一类定义中的同名成员函数才存在重载关系,主要特点时函数的参数类型和数目有所不同:但不能出现函数参数的个数和类型均相同,仅仅依靠返回值类型不同来区分的函数,这和普通函数的重载是完全一致

C++ Primer 学习笔记_29_操作符重载与转换(4)--转换构造函数和类型转换运算符归纳、operator new 和 operator delete 实现一个简单内存泄漏跟踪器

C++ Primer 学习笔记_29_操作符重载与转换(4)--转换构造函数和类型转换运算符归纳.operator new 和 operator delete 实现一个简单内存泄漏跟踪器 一.转换构造函数 可以用单个实参来调用的构造函数定义从形参类型到该类型的一个隐式转换.如下: class Integral { public: Integral (int = 0); //转换构造函数 private: int real; }; Integral A = 1; //调用转换构造函数将1转换为In

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符、成员函数方式重载、友元函数方式重载

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符.成员函数方式重载.友元函数方式重载 引言: 明智地使用操作符重载可以使类类型的使用像内置类型一样直观! 一.重载的操作符名 像任何其他函数一样,操作符重载函数有一个返回值和一个形参表.形参表必须具有操作符数目相同的形参.比如赋值时二元运算,所以该操作符函数有两个参数:第一个形参对应着左操作数,第二个形参对应右操作数. 大多数操作符可以定义为成员函数或非成员函数.当操作符为成员函数时,它的第一个操作数隐式绑定

Scala学习笔记及与Java不同之处总结-从Java开发者角度

Scala与Java具有很多相似之处,但又有很多不同.这里主要从一个Java开发者的角度,总结在使用Scala的过程中所面临的一些思维转变. 这里仅仅是总结了部分两种语言在开发过程中的不同,以后会陆续更新一些切换后在开发过程中值得注意的地方.以下列举了部分,但令人印象深刻的Scala语言的不同之处,具体的代码演示样例及具体阐述见下文. ? Scala中可直接调用Java代码,与Java无缝连接. 语句能够不用";"结束.且推荐不适用";". 变量声明时以var或va

C++ Primer笔记12_运算符重载_递增递减运算符_成员访问运算符

1.递增递减运算符 C++语言并不要求递增递减运算符必须是类的成员.但是因为他们改变的正好是所操作对象的状态,所以建议设定为成员函数. 对于递增与递减运算符来说,有前置与后置两个版本,因此,我们应该为类定义两个版本的递增与递减运算符. 问题来了,程序是如何区分前置和后置呢?因为都是++和-- 为了解决这个问题,后置版本的递增递减运算符接受一个额外的(不被使用)int类型的形参.当我们使用后置运算符时,编译器为这个形参提供一个值为0的实参.这个形参唯一的作用就是区分前置和后置运算符函数. 因为不会