文档章节

基本类型和操作之操作符和方法

柳哥
 柳哥
发布于 2014/06/06 10:24
字数 1038
阅读 118
收藏 1

Scala为基本类型提供了丰富的操作符集,这些操作符实际只是普通方法调用的另一种表现形式。例如, 1 + 2与 (1).+(2) 其实是一回事。换句话说,就是Int类包含了叫做+的方法,它传入一个Int参数并返回一个Int结果,如例:


实际上,Int包含了+的各种类型参数的重载方法。例如,另一个也叫+的方法的参数和返回类型都是Long。如果把Long加到Int上,就将转而调用这个+方法:


注:(1).+(2L)与(1).+(2)这样的调用方式,第一个操作数必须用括号括起来,否则会当成Double类型在scala2.10.7中测试好像不用加括号了!!!!)。

符号+是操作符----更明确地说,是中缀操作符。操作符标注不仅限于像+这种其他语言里看上去像操作符的东西,任何方法都可以被当作操作符来标注
例如,类String有个带Char参数的方法 indexOf ,它搜索String里第一次出现的指定字符,就像这样:


另外,String还提供了重载的indexOf方法,带两个参数的,尽管这个indexOf方法带两个参数,你仍然可以用操作符标注的方式使用它。不过这样用的时候,这些参数必须放在括号内,如:

重点任何方法都可以是操作符
Scala里的操作符不是特殊的语法,任何方法都可以是操作符。到底是方法还是操作符取决于你如何使用它。如果写成s.indexOf(‘o’),indexOf就不是操作符。但如果写成s indexOf ‘o’,那么indexOf就是操作符,因为你以操作符标注方式使用它。

到目前为止,你已经看到了中缀操作符标注的例子,也就是说调用的方法位于对象和传递给方法的参数或若干参数之间,如:“7 + 2”。Scala还有另外两种操作符标注方式。分别是前缀标注后缀标注。前缀标注中,方法名被放在调用的对象之前,如:“-7”里的“-”。后缀标中,方法放在对象之后,如:“7 toLong”里的“toLong”(这里好像需要一个import语句,不写会有警告!)。
与中缀操作符---两个操作数,分别在操作符的左右两侧---相反,前缀后缀操作符都是一元(unary)的;它们仅有一个操作数。前缀方式中,操作数在操作符的右边。前缀操作符的例子有:-2.0、!found和-0xFF。这些前缀操作符与中缀操作符一致,是值类型对象调用方法的简写形式。然而这种情况下,方法的全名就是在操作符字符前加上前缀“unary_”。例如,
Scala会把表达式-2.0转换成方法调用“(2.0).Unary_-”。


注意:标识符中能作为前缀操作符用的只有 + ,- ,! ,~ 。因此,如果对类型定义了名为unary_!的方法,就可以对值或变量用!p这样的前缀操作符方式调用方法但是即使定义了名为unary_*的方法,也没有办法将其用成前缀操作符了,因为*不是四种可以当作前缀操作符用的标识符之一。你可以像平常那样调用它,如:p.unary_*,但如果尝试像*p这么调用,scala就会把它理解为*.p,这或许就不是你所期望的了。
后缀操作符是不用点或括号调用的不带任何参数的方法。在scala里,方法调用的空括号可以省略惯例是如果方法带有副作用就加上括号,如:println(),如果没有副作用就去掉括号,如:”aa”.toLowerCase方法。

例子里的方法没有带参数,因此还可以去掉点,采用后缀操作符标注方式:


注意用后缀操作符标注好像有警告,原因是需要一个导入语句,如下例:

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 203
博文 405
码字总数 347782
作品 0
杭州
技术主管
编程思想 之「操作符」

温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋、,纠错。 在 Java 编程的过程中,我们对数据的处理,都是通过操作符来实现的。例如,用于...

qq_35246620
2017/12/09
0
0
C++重载操作符

什么叫重载操作符?这要先说什么是操作符,其实最简单的:+、-、*、/、<

Cloudox_
2017/12/07
0
0
基本类型和引用类型,执行环境和作用域

一、理解基本类型和引用类型的值 ECMAScript变量包含两种不同数据类型的值:基本类型值 和 引用类型值。 基本类型值指的是简单的数据段,而引用类型的值指那些可能由多个值构成的对象 引用类...

蒙懵懵
2016/04/13
22
0
《JAVA编程思想》学习笔记——第三章 操作符

在最底层,Java的数据是通过适用操作符来操作的。 几乎所有的操作符都只能操作"基本类型"。例外的操作符是"=","=="和"!=",这些操作符能操作所有的对象(这也是对象易令人糊涂的地方)。除此之...

lixiaocheng18
2016/12/29
0
0
C++ operator关键字(重载操作符)

operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符...

mac_zhao
2015/11/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

docker中安装了RabbitMQ后无法访问其Web管理页面

在官网找了"$ docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 rabbitmq:3-management"这条安装命令,在docker上安装了RabbitMQ,,结果输入http://localhost:8080并不......

钟然千落
33分钟前
0
0
spring-cloud | 分布式session共享

写在前面的话 各位小伙伴,你们有福了,这一节不仅教大家怎么实现分布式session的问题,还用kotlin开发,喜欢kotlin的小伙伴是不是很开心! 以前在写Android的时候,就对客户端请求有一定的认...

冯文议
52分钟前
0
0
c语言之内存分配笔记

先看一个数组: short array[5] = {1,2} // 这儿定义的一个int类型的数组,数组第1和第2个元素值是1和2.其余后面默认会给值为0; 或者 short array[] = {1,2};//这儿数组第1和第2个元素,数组...

DannyCoder
今天
4
0
Shell | linux安装包不用选择Y/N的方法

apt-get install -y packageOR echo "y" | sudo apt-get install package

云迹
今天
2
0
Hadoop的大数据生态圈

基于Hadoop的大数据的产品圈 大数据产品的一句话概括 Apache Hadoop: 是Apache开源组织的一个分布式计算开源框架,提供了一个分布式文件系统子项目(HDFS)和支持MapReduce分布式计算的软件架...

zimingforever
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部