Scala 3 — 書籍

變數和資料類型

語言

本節提供 Scala 變數和資料類型的說明。

兩種變數類型

在 Scala 中建立新變數時,您必須宣告變數是不變或可變的

變數類型 說明
val 建立不變變數,類似 Java 中的 final。除非有理由需要可變變數,否則您應該總是使用 val 建立變數。
var 建立可變變數,僅應在變數內容會隨著時間而變更時使用。

以下範例說明如何建立 valvar 變數

// 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

由於 IntDouble 是預設數值類型,因此您通常會在不顯式宣告資料類型的情況下建立它們

val i = 123   // defaults to Int
val j = 1.0   // defaults to Double

在您的程式碼中,您也可以附加字元 LDF(以及它們的小寫等效字元)到數字,以指定它們是 LongDoubleFloat

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

當您需要非常大的數字時,請使用 BigIntBigDecimal 類型

var a = BigInt(1_234_567_890_987_654_321L)
var b = BigDecimal(123_456.789)

其中 DoubleFloat 是近似十進位數,BigDecimal 則用於精確運算。

Scala 也有 StringChar 資料類型

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."""

有關字串插值器和多行字串的更多詳細資訊,請參閱 「深入了解類型」章節

此頁面的貢獻者