第五章 基本类型和操作
5.1 基本类型
注意:在scala中基本类型小写或者大写都是一个意思,例如int和Int,最后都转化为Scala.Int。后续可能不支持小写,推荐使用大写开头。Scala编译器能直接把Scala值类型在它产生的字节码里转义成Java的原始类型。
5.3 操作符与方法
前面提到过,1 + 2与(1).+(2)其实是一回事。换句话说,就是Int类包含了叫做+的方法,它带一个Int参数并返回一个Int结果。另外,Int包含了许多带不同的参数类型的重载:overload的+方法。例如,Int还有另一个也叫+的方法参数和返回类型为Long。如果你把Long加到Int上,这个替换的+方法就将被调用。
操作符标注不仅限于像+这种其他语言里看上去像操作符一样的东西,其实任何方法都当作操作符来标注。
查看如下代码:
scala> val s = "Hello, world!"
s: java.lang.String = Hello, world!
scala> s indexOf 'o' // Scala调用了s.indexOf(’o’)
res0: Int = 4
scala> s indexOf ('o', 5) // Scala调用了s.indexOf(’o’, 5)
res1: Int = 7
除了中缀操作符还有前缀(如“+”,“-”,“!”,“~”)和后缀操作符(如“toLong”)。前缀实际上调用了“unary_”。例如-2.0实际上调用了”(2.0).unary_-“。
后缀操作符是不用点或括号调用的不带任何参数的方法。Scala里,你可以舍弃方法调用的空括号。例外就是如果方法带有副作用就加上括号,如println(),不过如果方法没有副作用就可以去掉括号,如String上调用的toLowerCase。
所谓”副作用”(side effect),指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。
5.7 对象对等性
scala中的“==”除了可以作用于基本类型,也可以作用于所有对象。“==”两端的可以是相同类型,也可以是不同类型,甚至可以比较null或者任何可能为null的东西,而不会抛出异常。
scala中的“==”比较过程是:先判断左边是否为null,如果不是则调用equals方法。equals方法的精度取决于“==”左边的参数。Scala中不同类型判断“==”可能会得到true的结果。比如“1.0 == 1”的结果为true;“(“he”+”llo”)==”hello”结果为true。因为在有些类型里重写了equals方法,使得比较的是它们的内容而不是引用的对象。
5.8 操作符的优先级和关联性
Scala基于操作符格式里方法的第一个字符决定优先级。
但有一个例外:如果操作符以等号字符(=)结束,且操作符并非比较操作符<=,>=,==,或=,那么这个操作符的优先级与赋值符(=)相同。也就是说,它比任何其他操作符的优先级都低(如:“*=”,“+=”)
5.9 富包装器
scala中每个基本类型都有一个富包装器,如下所示。富包装器中提供了更丰富的方法。调用这些方法可以通过隐式转换实现。