本節提供 Scala 變數和資料類型的說明。
兩種變數類型
在 Scala 中建立新變數時,您必須宣告變數是不變或可變的
變數類型 | 說明 |
---|---|
val |
建立不變變數,類似 Java 中的 final 。除非有理由需要可變變數,否則您應該總是使用 val 建立變數。 |
var |
建立可變變數,僅應在變數內容會隨著時間而變更時使用。 |
以下範例說明如何建立 val
和 var
變數
// immutable
val a = 0
// mutable
var b = 1
在應用程式中,val
無法重新指派。如果您嘗試重新指派,會造成編譯器錯誤
val msg = "Hello, world"
msg = "Aloha" // "reassignment to val" error; this won’t compile
相反地,var
可以重新指派
var msg = "Hello, world"
msg = "Aloha" // this compiles because a var can be reassigned
宣告變數類型
建立變數時,您可以明確宣告其類型,或讓編譯器推斷類型
val x: Int = 1 // explicit
val x = 1 // implicit; the compiler infers the type
第二種形式稱為類型推斷,這是一種讓此類程式碼保持簡潔的絕佳方法。如這些 REPL 範例的輸出所示,Scala 編譯器通常可以為您推斷資料類型
scala> val x = 1
val x: Int = 1
scala> val s = "a string"
val s: String = a string
scala> val nums = List(1, 2, 3)
val nums: List[Int] = List(1, 2, 3)
如果您偏好,您隨時可以明確宣告變數的類型,但在像這些簡單的指派中,這並非必要
val x: Int = 1
val s: String = "a string"
val p: Person = Person("Richard")
請注意,採用此方法,程式碼會比必要的更冗長。
內建資料類型
Scala 附帶您預期的標準數值資料類型,而且它們都是類別的完整實例。在 Scala 中,所有內容都是物件。
這些範例顯示如何宣告數值類型的變數
val b: Byte = 1
val i: Int = 1
val l: Long = 1
val s: Short = 1
val d: Double = 2.0
val f: Float = 3.0
由於 Int
和 Double
是預設數值類型,因此您通常會在不顯式宣告資料類型的情況下建立它們
val i = 123 // defaults to Int
val j = 1.0 // defaults to Double
在您的程式碼中,您也可以附加字元 L
、D
和 F
(以及它們的小寫等效字元)到數字,以指定它們是 Long
、Double
或 Float
值
val x = 1_000L // val x: Long = 1000
val y = 2.2D // val y: Double = 2.2
val z = 3.3F // val z: Float = 3.3
當您需要非常大的數字時,請使用 BigInt
和 BigDecimal
類型
var a = BigInt(1_234_567_890_987_654_321L)
var b = BigDecimal(123_456.789)
其中 Double
和 Float
是近似十進位數,BigDecimal
則用於精確運算。
Scala 也有 String
和 Char
資料類型
val name = "Bill" // String
val c = 'a' // Char
字串
Scala 字串類似於 Java 字串,但它們有兩個很棒的附加功能
- 它們支援字串插值
- 很容易建立多行字串
字串插值
字串插值提供一種非常易讀的方式來使用字串中的變數。例如,給定這三個變數
val firstName = "John"
val mi = 'C'
val lastName = "Doe"
您可以將這些變數組合在字串中,如下所示
println(s"Name: $firstName $mi $lastName") // "Name: John C Doe"
只需在字串前面加上字母 s
,然後在字串中的變數名稱前面加上 $
符號即可。
若要將任意表達式嵌入字串中,請將它們括在花括號中
println(s"2 + 2 = ${2 + 2}") // prints "2 + 2 = 4"
val x = -1
println(s"x.abs = ${x.abs}") // prints "x.abs = 1"
您在字串前面放置的 s
只是其中一種可能的插值器。如果您使用 f
而不是 s
,則可以在字串中使用 printf
樣式的格式化語法。此外,字串插值器只是一個特殊方法,而且可以定義您自己的插值器。例如,一些資料庫函式庫定義了非常強大的 sql
插值器。
多行字串
多行字串是透過將字串包含在三個雙引號中來建立的
val quote = """The essence of Scala:
Fusion of functional and object-oriented
programming in a typed setting."""
有關字串插值器和多行字串的更多詳細資訊,請參閱 「深入了解類型」章節。