一、算术和操作符重载
a + b
是如下方法的简写:
a.+(b)
在scala中你可以使用任何符号来为方法命名。比如BigInt类就定义了一个/%的方法,该方法返回一个对偶,对偶的内容是除法操作得到的商和余数。
通常来说,你可以用
a 方法 b
作为以下代码的简写
a.方法(b)
这里的方法是一个带有两个参数的方法(一个隐式的和一个显示的)。例如1.to(10)可以简写成1 to 10
scala语言并没有提供++和--操作符,我们需要使用+=1和-=1
scala认为Int类是不可变的。
对于BigInt和BigDecimal对象,你可以以常规的方式使用那些数学操作符:
scala> val x:BigInt = 1234567890
x: BigInt = 1234567890 scala> x*x*x
res0: scala.math.BigInt = 1881676371789154860897069000
在java中这样的操作要写成x.multiply(x).multiply(x)
二、函数和方法
相比java,在scala中使用函数更为方便,你不需要从某个类调用它的静态方法
scala> import scala.math._ //在scala中,_是通配符,类似java的*
import scala.math._ scala> sqrt(2)
res3: Double = 1.4142135623730951 scala> pow(2,4)
res4: Double = 16.0
使用scala.开头的包时,我们可以省去scala前缀。例如import math._等同于import scala.math._ 而math.aqrt(2)等同于scala.math.sqrt(2)
通常一个类对应有一个伴生对象(companion object),其方法就跟java中的静态方法一样。
举例来说,BigInt类的BigInt伴生对象有一个生成指定位数随机素数的方法probablePrime:
scala> BigInt.probablePrime(100,scala.util.Random)
res6: scala.math.BigInt = 988540475240285093287416884009
这里的Random是一个单例的随机数生成器对象,而该对象是在scala.util表中定义的。这是用单例对象比用类更好的为数不多的场景之一。在java中,为每个随机数都构造出一个新的java.util.Random对象是一个常见的错误。
不带参数的scala方法通常不使用括号。一般来讲,没有参数且不改变当前对象的方法不带圆括号。
三、apply方法
scala> "hello"(4)
res7: Char = o
背后实现的原理是一个名为apply的方法。
也就是说
"hello"(4)是如下语句的简写:
"hello".apply(4)
BigInt伴生对象有将字符串或者数字转换为BigInt对象的apply方法
scala> BigInt("11113465684")
res8: scala.math.BigInt = 11113465684
像这样使用伴生对象的apply方法是scala中构建对象的常用手法。
例如
Array(1,4,9)返回是一个数组,用的就是Array伴生对象的apply方法。