文档章节

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

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

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


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

© 著作权归作者所有

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

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

qq_35246620
2017/12/09
0
0
swift4.1 系统学习二十四 操作符方法与操作符的定制

/* 操作符方法与操作符的定制 到目前为止,我们已经学习了swift的绝大部分的语法特性。本节中,我们还要学习swift的另一个灵活 多样的语法特性 —— 操作符方法。我们可以为自己定义的类或者...

小曼Study
11/02
0
0
C++重载操作符

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

Cloudox_
2017/12/07
0
0
《JAVA编程思想》学习笔记——第三章 操作符

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

lixiaocheng18
2016/12/29
0
0
基本类型和引用类型,执行环境和作用域

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

蒙懵懵
2016/04/13
22
0

没有更多内容

加载失败,请刷新页面

加载更多

《激荡三十年》读书笔记的相关感悟3300字

《激荡三十年》读书笔记的相关感悟3300字: 《激荡三十年》是吴晓波以编年体的方式记录的中国1978年改革开放后至2008年的30年的企业史。这套被称为“新货殖列传”的“企业史记”记录了三十年...

原创小博客
16分钟前
0
0
红外接收器驱动开发

背景:使用系统的红外遥控软件没有反应,然后以为自己接线错误,反复测试,结果烧坏了一个红外接收器,信号主板没有问题。所以自己开发了一个红外接收器的python驱动。接线参见https://my.os...

mbzhong
54分钟前
2
0
ActiveMQ消息传送机制以及ACK机制详解

AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的。 一. ActiveMQ消息传送机...

watermelon11
今天
1
0
HashTable和Vector为什么逐渐被废弃

HashTable,不允许键值为null,还一个就是put方法使用sychronized方法进行线程同步,单线程无需同步,多线程可用concurren包的类型。 如编程思想里面说的作为工具类,封闭性做的不好没有一个...

noob_chr
昨天
1
0
Win10 下安装Win7双系统

很多人买了预装64位Win8/8.1的电脑后想重装(或者再安装一个)Win7系统,但是折腾半天发现以前的方法根本不奏效。这是因为预装Win8/8.1的电脑统一采用了UEFI+GPT引导模式,传统的BIOS(Legacy...

yaly
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部