|
scala中操作符
在java等语言中,有int,short,char,float等关键字,表示基本值类型。而scala追求的是纯粹的面向对象,象这种不是
面象对象的int等基本类型是与目标不相符的,那么scala是如果处理这种问题的呢?实际上,在scala中定义了class Int,
class Char,class Float,class Byte,class Short,class Double,class Long,class Boolean,class Unit共9大类值类,
但这9个类都是abstract,比如:final abstract class Int private extends AnyVal,这样定义,说明Int是一个抽象的
final类,不能再修改这个类了,它是final类型的,继承自AnyVal(值类型的父类),且是private继承。也就是说Int既是
抽象的,也是不可继承,不能编写子类的,那怎么实例化出来一个对象呢?它们的对象通过“字面量”来实例化对象。
val v:Int = 128
既然在scala中万物皆对象,那128是Int类型的一个实例,128 + 3其实就可以理解为128.+(3),其实在Int类中还真有一个方法
def unary_+ : Int,这个方法其实就是 +,只不过这需要理解scala中的三种操作符概念:
1)前缀操作符
一个操作数前面的操作符称为前缀操作符,并且操作数只能有一个。注意 scala规定:前缀操作符是一个无参方法,调用这个方法
的对象是后面的操作数对象。前缀操作符只有+ - ! ~四个,对应的方法名分别是unary_+,unary_-,unary_!,unary_~,其它的操作符
哪怕是定义了unary_*或unary_/方法,也不能写成*o1或/o2,只能写成o1.unary_*或o2 unary_/的形式
2)中缀操作符
中缀操作符,左右两边都有操作数,两个操作数中的一个是调用该方法的对象,具体哪一个操作数是调用该方法的对象,根据
操作符来决定,以冒号":"结尾的操作符,其右操作数是调用该方法的对象,其它操作符都是将左边操作数作为方法的调用者
3)后缀操作符
后缀操作符表示操作符在操作数的后面,操作数只能有一个,也就是调用该方法的对象。关于后缀操作符与分号推理冲突分析可以参见下一帖
实验代码如下:
object OpsTest {
def main(args: Array[String]): Unit = {
val myInt = new MyInt(20)
println(!myInt) //-20
// println(*myInt) //提示错误
println(myInt.unary_*) //200
val myInt2 = new MyInt2(10)
println(myInt2 +* 5) //150
// println(myInt2 +: 5) //提示出错
println( 5 +: myInt2) //15
println(myInt2 method(5)) //20
println(myInt2 method 5) //20
}
}
class MyInt(val v:Int){
def unary_! = -v
def unary_* = v * 10
}
class MyInt2(val v:Int){
def +*(y:Int) = (y+v) * v
def +: (y:Int) = v + y
def method(y:Int) = (v + y) + y
}
|
|