文档章节

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

柳哥
 柳哥
发布于 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

没有更多内容

加载失败,请刷新页面

加载更多

大数据框架对比:Hadoop、Storm、Samza、Spark和Flink

简介 大数据是收集、整理、处理大容量数据集,并从中获得见解所需的非传统战略和技术的总称。虽然处理数据所需的计算能力或存储容量早已超过一台计算机的上限,但这种计算类型的普遍性、规模...

hblt-j
23分钟前
2
0
正则介绍及grep/egrep用法

10月16日任务 9.1 正则介绍_grep上 9.2 grep中 9.3 grep下 扩展 把一个目录下,过滤所有*.php文档中含有eval的行 grep -r --include="*.php" 'eval' /data 9.1 正则介绍_grep上 什么是正则 ...

zgxlinux
38分钟前
2
0
想用Unity3D引擎软件赚点钱的看过来

前言: 你可以不拥有很多钱 但你一定要有赚钱的能力 目前手上有项目, 需要熟练Unity3D引擎软件的伙伴 有意向的给我发私信

猿神出窍
40分钟前
1
0
Spring Boot全局异常处理

Spring Boot默认的异常处理机制 默认情况下,Spring Boot为两种情况提供了不同的响应方式。 一种是浏览器客户端请求一个不存在的页面或服务端处理发生异常时,一般情况下浏览器默认发送的请求...

狼王黄师傅
今天
8
0
Thinkphp5 优雅配置两个数据库

工作需要需要配置两个数据库,框架5.0的,步骤如下: 1、在database.php同级创建一个database2.php文件 在里面配置第二个数据库信息, 2、在config中配置这个数据库信息: 3、创建第二个表的...

wqzbxh
今天
5
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部