risc-v中文社区

 找回密码
 立即注册
查看: 1180|回复: 0

[原创] risc-v开发基础 Scala 操作符---(12)

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-8-4 14:56:37 | 显示全部楼层 |阅读模式
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
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-5-3 20:32 , Processed in 0.019951 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表