資料型態


在Scala中,一切都是物件,即使是一個整數也是物件:
scala> 1
res0: Int = 1

scala> "Hello"
res1: java.lang.String = Hello

scala>


Int實際上是scala套件(package)中的類別,Scala會自動import該套件下的類 別,Byte、Short、Int、Long、Char、Float、Double、Boolean等都位於scala套件中,在JVM上運行時,它們對 應於Java中的byte、short、int、long、char、float、double、boolean等基本型態(Primitive type),有著與Java中基本資料型態相同的範圍。

Scala也重用一些Java中的類別,例如字串,在上面的示範中可以看到,Scala直接重用了java.lang.String類別(Scala也會自動import套件java.lang)。

如果你在程式中直接寫一個整數,則預設是十進位的Int整數,你可以用0開頭表示這是個八進位整數,用0x開頭表示這是個十六進位整數,以L或l結尾時,表示這會是個Long整數:
scala> 010
res2: Int = 8

scala> 0xA
res3: Int = 10

scala> 123L
res4: Long = 123

scala>

如果你直接撰寫一個浮點數,則預設會是個Double,加上F或f可以指定其為Float,你也可以使用特學記號來表示浮點數:
scala> 3.14
res5: Double = 3.14

scala> 3.14F
res6: Float = 3.14

scala> 3.14e10
res7: Double = 3.14E10

scala> 3.14e2
res8: Double = 314.0

scala>


字元是以單引號包裹住,也可以指定Unicode編碼:
scala> 'A'
res9: Char = A

scala> '\u0041'
res10: Char = A

scala>


以\作開頭為跳脫字元,如以上指定Unicode編碼是其中一例,你還可以有以下的字元指定方式:
\\ 反斜線
\' 單引號 '
\" 雙引號 "
\uxxxx 以16 進位數指定Unicode字元輸出
\b 倒退一 個字元
\f 換頁
\n 換行
\r 游標移 至行首
\t 跳格 (一個Tab鍵)



在Scala中,若要取得整數、浮點數等的數值範圍,則可以使用scala.Math(這是一個object定義)中所定義的值(在Java中則是定義在各自的包裹物件上,如Integer、Double等),例如:
println("Int: " + Math.MIN_INT + " ~ " + Math.MAX_INT)
println("Long: " + Math.MIN_LONG + " ~ " + Math.MAX_LONG)
println("Float: " + Math.MIN_FLOAT + " ~ " + Math.MAX_FLOAT)
println("Double: " + Math.MIN_DOUBLE + " ~ " + Math.MAX_DOUBLE)

這個程式會顯示以下結果:
Int: -2147483648 ~ 2147483647
Long: -9223372036854775808 ~ 9223372036854775807
Float: -3.4028235E38 ~ 3.4028235E38
Double: -1.7976931348623157E308 ~ 1.7976931348623157E308


在Scala中,如整數、浮點數等基本的型態,可以直接作一些操作,例如:
scala> -13 abs
res5: Int = 13

scala> 1 max 2
res6: Int = 2

scala> 3.14 round
res7: Long = 3

scala>

事實上,abs、max、round等都是物件上的方法(在Scala中, 方法如果不帶引數或只帶一個引數,則括號可以省略),但並非Int、Double上的方法,在Scala中,如果發現某個方法不屬於某物件,則會嘗試看看 是否有定義的隱式轉換(Implicit conversion),在這邊的例子中,由於Scala為這些基本的資料型態定義了一些富包裹器(Rich Wrapper),當必要時,會嘗試將數值以富包裹器包裹,看看是否可以執行所指定的方法,例如abs、max其實是 scala.runtime.RichInt上的方法,round其實是scala.runtime.RichDouble上的方法。

下表列出了基本型態與富包裹器的對應:
scala.Byte scala.runtime.RichByte
scala.Char scala.runtime.RichChar
scala.Int scala.runtime.RichInt
scala.Long scala.runtime.RichLong
scala.Float scala.runtime.RichFloat
scala.Double scala.runtime.RichDouble
scala.Boolean scala.runtime.RichBoolean
java.lang.String scala.runtime.RichString