op运算符与.op方法调用是等价的,op表示运算符:+、-、*、/……
演示x + y与x.+(y)的等价性
![](https://img-blog.csdnimg.cn/img_convert/ac885e22486696e81482ba5176099845.png)
(二)方法即运算符
单参方法
str.indexOf('a') 与 str indexOf 'a' 是等价的
![](https://img-blog.csdnimg.cn/img_convert/1c7547b7dceeb9c44ad4cbb3b5cfab49.png)
多参方法
str.substring(2, 4) 与str substring (2, 4)是等价的
![](https://img-blog.csdnimg.cn/img_convert/bfda10bccdbd325450458974a8127a7b.png)
无参方法
![](https://img-blog.csdnimg.cn/img_convert/6849ff026bdbf6ff3f8e84939736822c.png)
![](https://img-blog.csdnimg.cn/img_convert/8bb6771b1baa533d599710c24d0f6897.png)
Scala中,如果是基本数据类型,==与!=比较的是值;如果是复杂数据类型,会隐含地调用equals进行比较,这也就意味着 Scala中不存在Java中经典的equals问题。
![](https://img-blog.csdnimg.cn/img_convert/18859c942edf2d4e3dba30df0ebc4bfd.png)
三、运算符种类
(一)中缀运算符(Infix Operator)
运算符符在两个操作数之间,2 + 3 等同于2.+(3)
![](https://img-blog.csdnimg.cn/img_convert/15aa250e8d566970320cc7a279a56b2d.png)
(二)前缀运算符(Prefix Operator)
运算符在唯一的操作数之前 :-1、+3、 ~0xFF、!false
-1等同于1.unary_-,前缀运算符如同中缀运算符一样,也是方法调用的另一种方式,不同的是,方法名要在符号前加上前缀unary_ 。
![](https://img-blog.csdnimg.cn/img_convert/5f643096ae8b4a0ee902130a33989705.png)
能作为前缀运算符的运算符只有+、-、!、~四种。如果你自己定义了unary_!方法就可以使用!前缀运算符来调用方法了,但是即使你定义了unary_*,*也不能用来调用该方法,因为*不是四种可用的前缀运算符之一。
![](https://img-blog.csdnimg.cn/img_convert/9845a5ef522cb89c9522ce293f668501.png)
(三)后缀运算符(Postfix Operator)
运算符在唯一的操作数之后str toUpperCase 等同于 str.toUpperCase(),后缀运算符不用点或括号调用无参方法。在Scala里,方法调用的空括号可以省略,但是如果去掉括号可能造成副作用就带上括号。
![](https://img-blog.csdnimg.cn/img_convert/a06f484f0fe6840f086e8ebabaf7e044.png)
四、运算符优先级
(一)简单说明
由于Scala并没有真正的运算符,运算符其实是方法的一种形式,所以此处运算符的优先级,其实就是指方法的优先级。在Scala中方法的执行是有优先级的区别的,这也是为了解决传统运算符优先级问题。
例如:3 + 2 * 5,我们期望获得的是13,但是根据Scala特点,Scala中所有运算符其实就是方法,那么按照这种说法,表达式应该等同于(3).+(2) 得到5,(5).*(5) 得到25,与我们的预期不符!Scala如何解决此问题呢?靠的是运算符优先级。
![](https://img-blog.csdnimg.cn/img_convert/fc2797c11f6d3ed5df1b0fee51216fb8.png)