在Scala中,一切都是物件,即使是一個整數也是物件:
scala> 1
res0: Int = 1
scala> "Hello"
res1: java.lang.String = Hello
scala>
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>
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>
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>
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
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>
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 |