黑猴子的家:Scala 算术操作符重载

Scala 的算术操作符和Java或者C++中的预期效果是一样的

val answer = 8 * 5 +2

+-*/等操作符和位操作符&|^>><<,在scala中实际上是方法

scala > 1+2
等同于
scala>1.+(2)

a + b 也可以写成 a.+(b)
def +(): Unit ={

}
这里的+是方法名,Scala并不会傻乎乎的对方法名使用非字母或数子这种做法,简单说使用中文和数字非常不好,但是Scala可以使用几乎任何符号来命名为方法名,例如BigInt类的/%方法,返回一个对偶,对偶的内容是除法操作符得到的商和余数

//显式调用
val (q,r) = BigInt(10)./%(3)
//商3 余1
println((q,r))
//也可以写成下面这样,省略括号和点
//隐式调用
val (q,r) = BigInt(10) /% 3
println((q,r))

采用哪种风格取决于对你编程的可读性,刚开始接触Scala的程序员倾向于使用Java语法风格这完全没有问题。当然了,即便是最坚定的Java程序员似乎也会选择a+b 而不是a.+(b)
和Java或者C++相比,Scala有一个显著的不同,Scala并没有提供++和 - - 操作符,我们需要使用+=1 或者-=1
counter += 1 //counter将递增,Scala没有++操作
Scala为什么没有提供++操作符?因为无法简单的实现一个++的方法,Int类型是不可变的,不能改变某个整数类型的值,Scala的设计者,认为不值得为这个方法添加一个特例

BigInt和 BigDecimal对象,可以以常规的操作数学操作符

scala> val a:BigInt = 1234567890
a: BigInt = 1234567890

scala> a * a * a
res0: scala.math.BigInt = 1881676371789154860897069000

这比Java好多了,在Java中同样的操作需要写成a.multiply(a).multiply(a)
尖叫提示:在Java中,不能对操作符进行重载,Java的设计者给出的解释是,这样做可以防止大家创造出类似@#$%!这样的操作符,是程序变得可读性不高,如果我们在Java中定义一个jskdfjskd的方法名,同样可以是程序的可读性不高。Scala允许我们可以定义操作符,由我们自己来决定在合适的时候使用这个特性

你可能感兴趣的:(黑猴子的家:Scala 算术操作符重载)