Scala對(duì)象系統(tǒng)
總體上,Scala
對(duì)象系統(tǒng)可分為兩類:
- 引用類型
- 值類型
引用類型
-
AnyRef
的子類 - 使用
new
構(gòu)造對(duì)象 - 當(dāng)存在默認(rèn)構(gòu)造函數(shù)狞谱,可以略去括號(hào)
-
AnyRef
等價(jià)于java.lang.Object
- 可以將
null
賦值給Reference Type
值類型
-
AnyVal
的子類 Char, Byte, Short, Int, Long, Float, Double, Unit, Boolean
- 不能使用
new
構(gòu)造實(shí)例庆猫,而使用Literal Values
構(gòu)造實(shí)例 - 編譯器將其映射為
Java
原生類型泌辫,以便提升性能 - 不能將
null
賦值給Int
的變量
以Int
為例巩步,Int
的定義應(yīng)該類似于:
final abstract class Int private extends AnyVal
-
final
表示不能被子類化 -
abstract
表示不能被實(shí)例化 -
private
表示主構(gòu)造函數(shù)私有化虱饿,進(jìn)一步保證不能被實(shí)例化 -
extends AnyVal
表示只能使用字面值構(gòu)造實(shí)例
數(shù)值
歸功于Scala
良好的可擴(kuò)展性哩俭,數(shù)值文字可以表現(xiàn)得像普通對(duì)象一樣绷跑。
1 to 10
事實(shí)上,Int
并不存在to
方法凡资,Predef
定義了一個(gè)Int
到RichInt
的隱式轉(zhuǎn)換砸捏,從而提供更豐富的操作數(shù)值的方法。
object Predef {
implicit def intWrapper(x: Int) = new runtime.RichInt(x)
}
package scala.runtime
class RichInt(val self: Int) extends AnyVal {
......
def to(end: Int): Range.Inclusive = Range.inclusive(self, end)
}
字符串
"+9519760513".exists(_.isDigit)
java.lang.String
并不存在exists
方法隙赁,Predef
定義了一個(gè)隱式轉(zhuǎn)換垦藏,使String
可以隱式地轉(zhuǎn)換為StringOps
,從而提供更豐富的操作字符串的方法伞访。
object Predef {
implicit def augmentString(x: String): StringOps = new StringOps(x)
}
Unit
值
Unit
類型在JVM
中對(duì)應(yīng)于Java
的void
掂骏。
final abstract class Unit private extends AnyVal
()
是其唯一的實(shí)例。
classOf[Unit] // Class[Unit] = void
().getClass // Class[Unit] = void
classTag[Unit] // scala.reflect.ClassTag[Unit] = Unit
classTag[Unit].runtimeClass // Class[_] = void
Null
值
Null
是所有AnyRef
的子類型厚掷,存在唯一的實(shí)例null
芭挽。不能將null
賦予Value Types
。
val num: Int = null // Error
符號(hào)
'1th
'2th
如果符號(hào)中有空格蝗肪,可以是使用Symbol::apply
直接構(gòu)造
Symbol("Programming Scala")
元組
(1, "two")
等價(jià)于Tuple2(1, "twp")
袜爪,或者Tuple2[Int, String](1, "two")
。
val t1 = (1, "two")
val t1: (Int,String) = (1, "two")
val t2: Tuple2[Int,String] = (1, "two")
函數(shù)值
(i: Int, s: String) => s+i
是類型為Function2[Int, String, String]
的一個(gè)字面值薛闪。
字面值的類型定義常常用于類型聲明:
val f1: (Int, String) => String = (i, s) => s + i
val f2 = (i: Int, s: String) => s + i
val f3: Function2[Int, String, String] = (i, s) => s+ i
自定義
歸功于Scala
良好的可擴(kuò)展性辛馆,Scala
可方便地實(shí)現(xiàn)文字的自定義。
Map元組
val capital = Map("US" -> "Washington", "France" -> "Paris")
"US" -> "Washington"
構(gòu)造了一個(gè)類型為Tuple2[String, String]
的二元組:("US", "Washington")
豁延。
package scala
object Predef {
implicit final class ArrowAssoc[A](self: A) extends AnyVal {
def ->[B](y: B) = (self, y)
}
}
正則表達(dá)式
val regex = "([0-9]+) ([a-z]+)".r
字符串內(nèi)插
println(s"$name is $age years old.")
s
其本質(zhì)僅僅是一個(gè)函數(shù)而已昙篙。
package scala
case class StringContext {
def s(args: Any*): String = ???
}