[读书日志]从零开始学习Chisel 第四篇:Scala面向对象编程——操作符即方法 ...

打印 上一主题 下一主题

主题 802|帖子 802|积分 2406

3.2操作符即方法

3.2.1操作符在Scala中的解释

在其它语言中,定义了一些基本的范例,但这些范例并不是我们在面向对象中所说的类。好比说1,这是一个int范例常量,但不能说它是int范例的对象。针对这些数据范例,存在一些基本操作符,好比算数操作符“+”。Scala所寻求的是极致的面向对象,因此Scala其实定义了 class Byte、class Short等等9个值类,但他们是不可继承的,抽象的,不能通过new创建一个Int对象,也不能编写他们的子类。
严酷来说,Scala不存在操作符的概念,这些算术运算的加减乘除,逻辑运算的与或非,比较运算的大于小于等,其实都是定义在class Int、class Double中的成员方法。在Scala中,操作符即方法。在Scala中,表达式1+2的真正形式是1.+(2)也就是说,调用了Int类的“+”方法,对象2是一个传入的参数,最后返回一个对象3。
操作符即方法的概念不仅仅限于9种值类的操作符,Scala种任何类定义的成员方法都是操作符,且方法调用都能写成操作符的形式:去掉句点符号,并且在方法参数只有一个时可以省略括号。
在书中给出的代码是如许的:
  1. scala> class Students3(val name: String,var score: Int) {
  2.     | def exam(s:Int) = score = s
  3.     | def friends(n:String,s:Int) = println("My friend " + n + " gets " + s + ".")
  4.     | override def toString = name + "'s score is " + score + "."
  5.     | }
  6. // defined class Students3
  7. scala> val stu3 = new Students3("Alice",80)
  8. val stu3: Students3 = Alice's score is 80.
  9. scala> stu3 exam 100
  10. 1 warning found
  11. -- Warning: ------------------------------------------------------------------------------------------------------------
  12. 1 |stu3 exam 100
  13.  |     ^^^^
  14.  |     Alphanumeric method exam is not declared infix; it should not be used as infix operator.
  15.  |     Instead, use method syntax .exam(...) or backticked identifier `exam`.
复制代码
但在最新版Scala中直接调用会报错,这是因为新版Scala对于这个利用方法举行了约束,有3种解决方案:解决方法
方法 1:利用标准方法调用语法
将代码修改为标准的点号方法调用:
  1. stu3.exam(100)
复制代码
方法 2:利用反引号
如果盼望继承利用中缀调用,则可以用反引号标记方法:
  1. stu3 `exam` 100
复制代码
方法 3:定义方法为 @infix(保举)
如果盼望以中缀形式调用 exam,可以在方法定义上添加 @infix 注解。比方:
  1. import scala.annotation.infix
  2. class Student {
  3.  @infix
  4.  def exam(score: Int): Unit = {
  5.    println(s"Score: $score")
  6.   }
  7. }
复制代码
然后即可利用:
  1. stu3 exam 100
复制代码
3.2.2三种操作符

前缀操作符
只有“+,-,!,~”这四个,他们的操作数只有1个。可以创建一个类,在此中自定义这些方法,要求命名的格式雷同于“unary_+”,如果末尾操作符在这四个以外,则不能利用如许的方法调用:
  1. scala> class MyInt(val x:Int) {
  2.     | def unary_! = -x
  3.     | def unary_* = x * 2
  4.     | }
  5. // defined class MyInt
  6. scala> val mi = new MyInt(10)
  7. val mi: MyInt = MyInt@4df13dd0
  8. scala> !mi
  9. val res1: Int = -10
  10. scala> *mi
复制代码
*mi在这里是无法调用的,无法输出效果,必须以下面的形式调用:
  1. scala> mi.unary_*
  2. val res2: Int = 20
复制代码
中缀操作符
中缀操作符左右两边都接收操作数,它对应普通的有参方法。两个操作数中的一个是调用该方法的对象,一个是传入该方法的参数,参数没有数目限制,只不过多个参数需要放在圆括号中。规定以冒号:末端的操作符,其右操作数是调用该方法的对象,别的的操作数的左操作数是调用该方法的对象。
  1. scala> class MyInt2(val x:Int) {
  2.     | def +*(y:Int) = (x + y) * y
  3.     | def +:(y:Int) = x + y
  4.     | }
  5. // defined class MyInt2
  6. scala> val mi2 = new MyInt2(10)
  7. val mi2: MyInt2 = MyInt2@6bf54260
  8. scala> mi2 +* 10
  9. val res3: Int = 200
  10. scala> mi2 +: 10
  11. -- [E008] Not Found Error: ---------------------------------------------------------------------------------------------
  12. 1 |mi2 +: 10
  13.  |    ^^^^^
  14.  |    value +: is not a member of Int
  15. 1 error found
  16. scala> 10 +: mi2
  17. val res4: Int = 20
复制代码
后缀操作符
写在操作数背面的操作符称为后缀操作符,并且操作数只有一个,即调用该方法的对象。如果方法名构成前缀操作符的条件,那么既可以写成前缀操作符,又可以把完整的方法名写成后缀操作符。
  1. scala> class MyInt3(val x:Int) {
  2.     | def display() = println("the value is " + x + ".")
  3.     | }
  4. // defined class MyInt3
  5. scala> val mi3 = new MyInt3(10)
  6. val mi3: MyInt3 = MyInt3@1aee6d14
  7. scala> import scala.language.postfixOps
  8. scala> mi3.display()
  9. the value is 10.
复制代码
3.2.3操作符的优先级和结合性

优先级
可以通过方法名的首个字符比较优先级,前缀操作符的方法名要去掉关键字。圆括号优先级是最高的。下表从高到低列出了字符的优先级:
首个字符所有其他字符(最高)*/%+-:=!<>&^|所有字母所有赋值操作符(最低) 这个规则有一个例外,就是如果操作符以等号末端,并且不是<=,>=,==,!=,那么就认为是赋值运算符,优先级最低。好比sum*=1+2,优先级是+更高。
结合性
一样寻常情况下同级的操作符都是从左往右结合的,但是以冒号末端的中缀操作符的调用对象在右侧,以是这些操作符是从右往左结合的。
3.2.4预设操作符

Scala预设了常用的算术运算、逻辑运算的操作符,如下图所示:

3.2.5对象的相等性

相等性可以分为两种,一种是天然相等性,一种是引用相等性。
天然相等性就是我们常见的相等性,只要字面上的值相等,就认为两个对象相等。引用相等性用于比较两个变量是否引用了同一个对象,即是否指向JVM堆中的同一个内存空间。Scala种==和!=只用来比较天然相等性,引用相等性可以利用eq和ne方法,它们是被所有类隐式继承的,且不可被子类重写。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

耶耶耶耶耶

金牌会员
这个人很懒什么都没写!

标签云

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