Scala学习笔记03:操作符
一、scala中操作符与方法的等价性
scala中操作符即方法、方法即操作符。scala中操作符其实是普通方法调用的另一种表现形式,运算符的使用其实就是隐含地调用对应的方法。
1、操作符即方法
运行结果如下:
2、方法即操作符
var str = "abcdef";
var x1 = str.indexOf("c");
var x2 = str indexOf "c";
var x3 = str.substring(2, 4);
var x4 = str substring (2,4) // 如果参数有多个,需要用小括号包起来
var x5 = str.toUpperCase();
var x6 = str.toUpperCase; // 方法调用时如果不需要传入任何参数,小括号可以省略
var x7 = str toUpperCase; // 这种写法,如果没有参数,则括号不用写
(1)单参数方法
运行结果如下:
(2)多参数方法
运行结果如下:
(3)无参方法
运行结果如下:
2、scala操作类型
(1)算术运算:+、-、*、/
(2)关系运算:>、<、>=、<=
(3)逻辑运算:&& 、||、!
(4)位运算:>>、>>>、<< 、~、 &、 |、 ^
(5)比较运算:==、!=
和Java基本相同,不同之处在于比较运算符:
- Java中,如果是基本数据类型,==与!= 比较的是值;如果是复杂数据类型,比较的是对象的地址,如果不是想比较地址而是想比较真正的内容,则需要使用 equals 方法。
- Scala中,如果是基本数据类型,==与!= 比较的是值;如果是复杂数据类型,会隐含地调用equals进行比较,这也就意味着 Scala中不存在Java中经典的equals问题。
3、操作符种类
(1)中缀操作符
操作符在两个操作数之间 2 + 3 等同于 (2).+(3)
(2)前缀操作符
操作符在唯一的操作数之前 -1、+3、 ~0xFF、!false
-1等同于(1).unary_-,前缀操作符如同中缀操作符一样,也是方法调用的另一种方式,不同的是,方法名要在符号前加上前缀unary_ 。
能作为前缀操作符的操作符只有+、-、!、~四种。如果你自己定义了unary_!方法就可以使用!前缀操作符来调用方法了,但是即使你定义了unary_*,*也不能用来调用该方法,因为*不是四种可用的前缀操作符之一。
(3)后缀操作符
操作符在唯一的操作数之后 str toUpperCase 等同于 str.toUpperCase(),后缀操作符是不用点或括号调用的不带任何参数的方法。在Scala里,方法调用的空括号可以省略,但是如果去掉括号可能造成副作用就带上括号。
4、操作符优先级
由于scala并没有真正的操作符,操作符其实是方法的一种形式,所以此处操作符的优先级,其实就是指方法的优先级
在scala中方法的执行是有优先级的区别的。这也是为了解决传统操作符优先级的问题的。
例如:3 + 2 * 5,我们期望获得的是13,但是根据scala特点,scala中所有操作符其实就是方法,那么按照这种说法,表达式应该等同于:(3).+(2) 得到5,(5).*(5) 得到25,与我们的预期不符!scala如何解决此问题呢?靠的是操作符的优先级。
scala中操作符(方法)的优先级是根据操作符(方法)的首字符决定的,以下符号越靠上优先级越高:
* / %
+ -
:
!=
<>
&
^
|
所有字母
所有赋值操作符
另外如果操作符以=结尾,且操作符并非比较操作符 <=、>=、==或=,则操作符优先级等同于=,即优先级最低,例如 +=、-=等;同级别优先级从左到右统计;可以使用括号改变优先级,且这是个好习惯,特别是在scala这种可能过于简洁的语言中。特殊的是,以:字符结尾的方法由它的右操作数调用,并传入左操作数。以其他字符结尾的方法与之相反。a :: b 对应的是 (b).::(a) 而不是 (a).::(b)。
本文分享 CSDN - howard2005。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。