一、运算符
- Scala中运算符即方法、方法即运算符。Scala中运算符其实是普通方法调用的另一种表现形式,运算符的使用其实就是隐含地调用对应的方法。
(一)运算符即方法
- op运算符与.op方法调用是等价的,op表示运算符:+、-、*、/……
- 演示x + y与x.+(y)的等价性
![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/d48d8dddbb1942ea50170a7af57bb012.jpeg)
(二)方法即运算符
1、单参方法
val str = "abcdef"
val x1 = str.indexOf('c')
val x2 = str indexOf 'c'
- str.indexOf(‘c’) 与 str indexOf ‘c’ 是等价的
![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/9ce99e0295b4e025620b8f8cf2fb9a0e.jpeg)
2、多参方法
val x3 = str.substring(2, 4)
val x4 = str substring (2,4)
- str.substring(2, 4) 与str substring (2, 4)是等价的
![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/331f4a5360b5045d47cbf7ce8c02eec0.jpeg)
3、无参方法
val x5 = str.toUpperCase()
val x6 = str.toUpperCase
val x7 = str toUpperCase
![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/03c6aff1e56d4ab2284c62d248979aa1.jpeg)
二、Scala运算符
(一)运算符分类表
运算符类型 | 运算符 |
---|
算术运算 | +、-、*、/ |
关系运算 | >、<、>=、<= |
逻辑运算 | &&、! |
位运算 | >>、>>>、<<、~、&、^ |
比较运算 | ==、!= |
- Scala中,如果是基本数据类型,==与!= 比较的是值;如果是复杂数据类型,会隐含地调用equals进行比较,这也就意味着
Scala中不存在Java中经典的equals问题。
![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/6920e9fe65e48a60f32bef0e2bfa3f6d.jpeg)
二、运算符种类
(一)中缀运算符(Infix Operator)
- 运算符符在两个操作数之间 2 + 3 等同于 (2).+(3)
![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/c8dc7bbccea2bf9e520dbe96855cc598.jpeg)
(二)前缀运算符(Prefix Operator)
- 运算符在唯一的操作数之前 :-1、+3、 ~0xFF、!false
- -1等同于1.unary_-,前缀运算符如同中缀运算符一样,也是方法调用的另一种方式,不同的是,方法名要在符号前加上前缀unary_ 。
![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/2f97deccbea351705eac85887414c329.jpeg)
- 能作为前缀运算符的运算符只有+、-、!、~四种。如果你自己定义了unary_!方法就可以使用!前缀运算符来调用方法了,但是即使你定义了unary_*,也不能用来调用该方法,因为不是四种可用的前缀运算符之一。
![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/a7bb8d66f9294a8731fd7e72864d7fa0.jpeg)
(三)后缀运算符(Postfix Operator)
- 运算符在唯一的操作数之后 str toUpperCase 等同于
str.toUpperCase(),后缀运算符不用点或括号调用无参方法。在Scala里,方法调用的空括号可以省略,但是如果去掉括号可能造成副作用就带上括号。
![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/4e95496503188dc43bf0233ec71fa071.jpeg)
三、运算符优先级
(一)简单说明
- 由于Scala并没有真正的运算符,运算符其实是方法的一种形式,所以此处运算符的优先级,其实就是指方法的优先级。在Scala中方法的执行是有优先级的区别的,这也是为了解决传统运算符优先级问题。
- 例如:3 + 2 *
5,我们期望获得的是13,但是根据Scala特点,Scala中所有运算符其实就是方法,那么按照这种说法,表达式应该等同于(3).+(2)
得到5,(5).*(5) 得到25,与我们的预期不符!Scala如何解决此问题呢?靠的是运算符优先级。
![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/83820ee2ab49b2ffa279bed0ea122cc7.jpeg)