在 Kotlin 中建立和使用變數

1. 事前準備

您有否發現,使用的手機應用程式中,有些部分會維持不變,其他部分則會有變化 (或可變動)。

例如,在「設定」應用程式內,「網路與網際網路」、「已連結的裝置」、「應用程式」等類別名稱是維持不變的。

72302735e50d7d85.png

另一方面,當您查看新聞應用程式時,新聞報導是瞬息萬變的。新聞標題、來源、發布時間和圖片都會變。

那您如何編寫程式,讓內容隨著時間改變?您無法在每次發布新報導時重新編寫應用程式中的程式碼,因為每天、每小時甚至每分鐘都會有新報導!

在本程式碼實驗室中,您會瞭解如何編寫使用變數的程式碼,讓程式的特定部分可以變動,無須編寫一整套新的指令。您將會如在先前的編碼實驗室,同樣使用 Kotlin Playground。

建立什麼

  • 在 Kotlin 編寫利用變數的簡短程式。

課程內容

  • 如何設定變數及更新變數的值。
  • 如何從 Kotlin 的基本資料類型中,為變數選擇適當的資料類型。
  • 如何在編碼中加入註解。

軟硬體需求

  • 一台可連上網際網路並具備網路瀏覽器的電腦。

2. 變數和資料類型

電腦程式設計裡,有一個變數的概念,這是儲存單一資料的容器。您可以視之為內含值的盒子。這盒子上有變數名稱的標籤。只要參照盒子的名稱,就可以存取盒子儲存的值。

這個圖表顯示變數如何存放資料,就像盒子可以存放東西。有一個盒子,它上面寫著它的名字。在盒子外面,有一個標示值的標籤。有一個箭頭從值指向盒子,表示那個值進入盒子內。

如果可以直接使用這個值,為什麼要將該值存放在盒子內,並依名稱參照盒子?問題在於,當您的編碼於所有指令中直接使用值時,您的程式將僅適用於該特定情況。

讓我們舉個例子,這樣您就可以更輕鬆地瞭解變數為何有用。以下是一封寄送給您近期會面人物的信件。

Lauren,您好:

很高興今天在辦公室與您會面。期待星期五再見!

祝您愉快!

這信件很好,但只適用於 Lauren 這特定情況。如果您知道要寫同一封信好幾次,但收信人略有不同,該怎麼辦?建立一信件範本,留空可更改部分,應該會更有效率。

親愛的 ____:

很高興今天在 _____ 與您會面。期待 ____ 再見。

祝您愉快!

您還可以具體規定每個空格的資料類型。以確保信件範本,能符合預期地使用。

親愛的 { name }:

很高興今天在 { location } 與您會面。期待 { date} 再見。

祝您愉快!

這概念與編寫應用程式很類似。您為某些資料而預留位置,同時保持應用程式的其他部分不變。

這張插圖為新聞應用程式的範例,畫面中的內容開頭是歡迎訊息,其中姓名部分留白,是使用者真實姓名的預留位置。接著還有一些文字:

在上方新聞應用程式的插圖中,「Welcome」(歡迎) 文字、「Latest news for you」(您的專屬新聞) 標題和「View more articles」(查看更多報導) 按鈕文字維持不變。然而,使用者名字與每篇報導的內容都會有所變更。因此,這是使用變數來儲存每條資訊的好機會。

這圖示內有 3 個盒子,並排成一列。第一個盒子標示為「name」(名稱)。旁邊標籤註明

您沒有必要在新聞應用程式中專門為名叫「Alex」的使用者,或始終使用相同標題和發布日期的新聞報導編寫適用的程式碼 (或指令)。與之相對,您可以在編寫程式碼時引用 namearticle1Namearticle1Date 等變數名稱,增加應用程式的靈活性。這樣一來,這種可通用的程式碼就能在不同使用者名稱和報導詳細資料的各種使用情境下運作。

利用變數的應用程式範例

我們來看看一個應用程式範例,查看它在哪裡可能使用變數。

a7e1f5184e4e3b15.png

在 Google 地圖應用程式中,您可以看到每個地點的詳細資料畫面,例如餐廳或商家。上方 Google 地圖應用程式螢幕截圖,顯示 Google 公司總部 (稱為 Googleplex) 的詳細資料。您覺得哪些應用程式儲存的資料是變數?

  • 地點的 名稱
  • 地點的 星級評價
  • 地點的 評論數量
  • 用戶是否 曾儲存 (或加入書籤) 這地點
  • 地點的地址

只要變更儲存在這些變數中的資料,Google 地圖應用程式便具有足夠的靈活性,也能顯示其他地點的詳細資料。

資料類型

決定應用程式的哪些部分可變動時,必須指定這些變數可以儲存的「資料類型」。在 Kotlin,常見基本資料類型如下。下表列出每列的不同資料類型。每種資料類型都有自己可以儲存那種資料的描述,以及範例值。

Kotlin 的資料類型

可以儲存什麼類型的資料

文字值範例

String

文字

"Add contact"
"Search"
"Sign in"

Int

整數

32
1293490
-59281

Double

小數

2.0
501.0292
-31723.99999

Float

小數 (不如 Double 精確)。數字結尾有 fF

5.0f
-1630.209f
1.2940278F

Boolean

truefalse. 當只有兩個可能的值,請使用這資料類型。請注意,truefalse 是 Kotlin 中的關鍵字。

true
false

現在您已瞭解部分常見的 Kotlin 資料類型,那麽對於在先前的地點詳細資料頁面中找出的各個變數而言,分別適合採用哪種資料類型?

a7e1f5184e4e3b15.png

  • 地點的名稱是文字,因此可儲存在資料類型為 String 的變數中。
  • 地點的星級評等是小數 (例如 4.2 顆星),可以儲存為 Double
  • 地點的 評論數量 是整數,因此應該以 Int 的形式儲存。
  • 對於使用者是否已儲存這個地點,相關資料只會有兩個可能的值 (「已儲存」或「未儲存」),可以儲存為 Boolean,以 truefalse 代表各個狀態。
  • 地點的地址屬於文字,因此應該是 String

在以下兩個情境中練習。在下列應用程式中,找出所用的變數及資料類型。

  1. 您可以透過應用程式觀看影片 (例如 YouTube 應用程式),畫面上會顯示影片的詳細資料。哪裡可能使用了變數?這些變數的資料類型是什麼?

a1688b9b297c7501.png

雖然目前沒有單一正確答案,但在影片應用程式中,變數可用於下列資料:

  • 影片的 名稱 (String)
  • 頻道的 名稱 (String)
  • 影片的 觀看次數 (Int)。
  • 影片的 按讚數量 (Int)
  • 影片的評論數量 (Int)
  1. 在「訊息」等應用程式中,畫面會列出最近收到的訊息。哪裡可能使用了變數?這些變數的資料類型是什麼?

f515a6481cc91bf2.png

同樣,正確答案不止一個。在「訊息」應用程式中,變數可用於下列資料:

  • 傳送者的手機號碼 (String)
  • 訊息的時間戳記 (String)
  • 訊息內容的預覽 (String)
  • 訊息是否未讀 (Boolean)

試試看

  1. 在手機上開啟您最愛的應用程式。
  2. 在那個應用程式某個螢幕截圖中,找出各個使用變數的位置。
  3. 猜測這些變數的資料類型。
  4. 在社群媒體分享您的答案,附上應用程式的螢幕截圖,說明您認為應用程式的哪些地方使用了變數,並加上 #AndroidBasics 主題標記。

目前為止,這編碼實驗室的成果很棒!請前往下一節,進一步瞭解如何在程式碼中使用變數和資料類型。

3. 定義和使用變數

定義與使用變數

您必須先在程式碼中定義變數,才能使用這個變數。這類似您在之前的編碼實驗室中,學到使用函數前,要先定義函數。

當您定義變數時,您需要給變數一個獨一無二的名稱。您還可以通過規定變數的資料類型,以決定變數可以儲存的資料類型。最後,您可以在變數中儲存一個初始值,但這是非強制的。

定義變數後,就可以在程式中「使用」該變數。如要使用變數,請在編碼中輸入變數名稱,以便 Kotlin 編譯器在編碼中,使用那個變數的值。

例如,您可以在用戶收件匣中,定義未讀郵件數量的變數。變數的名稱可以是「count」。在變數內儲存一個值,例如數字 2,代表用戶收件匣內有 2 封未讀郵件。(您可以在變數中儲存其他數字,但為了達到本範例的目的,請使用數字 2。)

有一個盒子,上面寫著「count」。盒子外面有一個寫著 2 的標籤。有一個箭頭從值指向盒子,表示那個值進入盒子內。

每當程式碼需要存取未讀訊息的數量時,請在程式碼中輸入 count。執行指令時,Kotlin 編譯器會在程式碼中偵測到對應的變數名稱,然後在其位置使用變數值。

從技術角度而言,可以用更具體的詞彙來描述這個過程:

「運算式」是一小段程式碼,可求值並得到一個值。運算式可以由變數、函式呼叫等元素組成。在以下範例中,「運算式」由一個 count 變數組成。這個運算式的求值結果為 2

此圖顯示一個運算式,並在旁邊顯示這個運算式的值。有一個表式標籤,它的下方寫著:count。在它的右邊,有一個「value」字樣的標籤,標籤下方寫著:2。

「求值」的意思是確定運算式的值。在這範例中,表式評估為 2。編譯器在編碼中評估表式,並在程式中運行各種指示時,使用這些值。

這圖旨在顯示,那表式 count 評估為 2。計算變數名稱 (count) 顯示在值 2 的旁邊。count 變數被圈起來,有一個箭頭從 count 變數指向 2 這個值。箭頭標有片語

如果要在 Kotlin Playground 中觀察這個行為,請在下一節執行此程式。

範例

  1. 在網頁瀏覽器開啟 Kotlin Playground
  2. 在 Kotlin Playground 中,使用下列程式,以取代現有編碼。

這個程式會建立名為 count,初始值為 2 的變數,其使用方式為輸出 count 變數的值並在輸出內容中顯示。如果您對編碼語法各方面還是不太清楚,請不要擔心。我們會在後續的章節中,詳細說明。

fun main() {
    val count: Int = 2
    println(count)
}
  1. 運行程式,輸出結果應該如下:
2

變數宣告

在您運行的程式中,編碼的第二列顯示:

val count: Int = 2

這個敘述建立名為 count 的整數變數,當中含有數字 2

有一個盒子,上面寫著「count」。盒子外面有一個寫著 2 的標籤。有一個箭頭從值指向盒子,表示那個值進入盒子內。

要熟悉在 Kotlin 中宣告變數的語法 (或格式),可能需要一些時間。下圖顯示變數相關各項詳細資料的正確位置,以及空格和符號的位置。

此圖顯示在 Kotlin 內宣告變數的語法。變數宣告以單字 val 起始,後面跟著一個空格。它的右邊是一個有標名稱的盒子。盒子名稱的右邊是冒號。冒號後還有一個空格,然後是一個有標資料類型的盒子。在這盒子的右邊,有一個空格和等號,然後是另一個空格。右邊是一個標有「initial value」字樣的方塊。

在下面的 count 變數範例情境中,您可以看到以單字 val 開頭的變數宣告。這個變數的名稱是 count。資料類型是 Int,而初始值是 2

此圖顯示一行程式碼:「val count: Int = 2」,當中有幾個箭頭指向程式碼的各個部分並加上說明,還有一個名稱標籤指向程式碼中的「count」這個單字。有一個資料類型標籤,指向編碼中「Int」這個字。有一個起始值標籤指向程式碼中的數字 2。

下文將詳細說明變數宣告的每個部分。

用於定義新變數的關鍵字

請先輸入 Kotlin 關鍵字 val (它代表值),以定義新變數。然後,Kotlin 編譯器認出這敘述內有變數宣告。

變數名稱

就像函數名稱一樣,您也可以為變數命名。在變數宣告中,變數名稱跟隨 val 關鍵字。

此圖顯示宣告變數在 Kotlin 內的語法。變數宣告以單字 val 起始,後面跟著一個空格。它的右邊是一個有標名稱的盒子。名稱盒子以綠色邊框和背景醒目顯示,讓使用者注意到這部分是變數宣告。盒子名稱的右邊是冒號。冒號後還有一個空格,然後是一個有標資料類型的盒子。在這盒子的右邊,有一個空格和等號,然後是另一個空格。右邊是一個標有「initial value」字樣的方塊。

您可以選擇使用任何變數名稱,但建議避免使用 Kotlin 關鍵字做為變數名稱。

選擇的名稱最好能夠描述變數存放的資料,讓程式碼易於解讀。

變數名稱應遵循「駝峰式大小寫」慣例,就與函式名稱一樣。變數名稱的第一個字是小寫。如果名稱中包含多個單字,單字之間不能有空格,且所有其他單字的首字母都應使用大寫。

變數名稱範例:

  • numberOfEmails
  • cityName
  • bookPublicationDate

早前的編碼範例中,變數的名稱是 count

val count: Int = 2

變數資料類型

在變數名稱之後,新增一個冒號和空格,然後是變數的資料類型。如先前所述,StringIntDoubleFloat,Boolean 是 Kotlin 的基本資料類型。本課程稍後將會介紹更多資料類型。切記準確拼寫資料類型,並首字母為大寫。

此圖顯示宣告變數在 Kotlin 內的語法。變數宣告以單字 val 起始,後面跟著一個空格。它的右邊是一個有標名稱的盒子。盒子名稱的右邊是冒號。冒號後還有一個空格,然後是一個有標資料類型的盒子。資料類型盒子以綠色邊框和背景醒目顯示,讓使用者注意到這部分是變數宣告。資料類型的右邊有一個空格和等號,然後是另一個空格。右邊是一個標有「initial value」字樣的方塊。

count 變數範例中,Int 是變數的資料類型。

val count: Int = 2

指定運算子

在變數宣告中,等號 (=) 跟隨資料類型。等號被稱為 指定運算子。指定運算子為變數指定值。換句話說,等號右邊值的變數會儲存在等號左邊的變數中。

此圖顯示一行程式碼:「val count: Int = 2」,其中有一個箭頭從「2」(位於等號右側) 指向「count」這個單字 (位於等號左側)。這表示值 2 正儲存在「count」變數中。

變數初始值

變數值是儲存在變數中的實際資料。

此圖顯示宣告變數在 Kotlin 內的語法。變數宣告以單字 val 起始,後面跟著一個空格。它的右邊是一個有標名稱的盒子。盒子名稱的右邊是冒號。冒號後還有一個空格,然後是一個有標資料類型的盒子。資料類型的右邊有一個空格和等號,然後是另一個空格。右邊是貼了「初始值」標籤的盒子。初始值盒子以綠色邊框和背景醒目顯示,讓使用者注意到這部分是變數宣告。

count 變數範例中,變數的初始值是數字 2

val count: Int = 2

您可能也會聽到:「count 變數已『初始化』2」,這表示 2 是宣告變數時儲存在變數中的第一個值。

初始值會因變數宣告的資料類型而不同。

請參閱下表,您可能會發現,這個表格在程式碼實驗室的前面部分出現過。第三欄顯示各個相應類型的變數可以儲存的範例值。這些值稱為「常值」,因為這些值是固定值或常數值 (也就是維持不變的值)。例如,整數 32 的值一直是 32。相比之下,變數不是常值,因為變數的值可以變動。您可能會聽到這些文字值,以它們的類型引用:字串文字、整數文字和布林文字等。

Kotlin 的資料類型

可以儲存什麼類型的資料

文字值範例

String

文字

"Add contact"
"Search"
"Sign in"

Int

整數

32
1293490
-59281

Double

小數

2.0
501.0292
-31723.99999

Float

小數 (不如 Double 精確)。數字結尾有 fF

5.0f
-1630.209f
1.2940278F

Boolean

truefalse. 當只有兩個可能的值,請使用這資料類型。請注意,truefalse 是 Kotlin 中的關鍵字。

true
false

請務必根據變數的資料類型,提供適當而有效的值。舉例來說,您不能在 Int 類型的變數中儲存 "Hello" 這類字串文字,因為 Kotlin 編譯器會告知您這是錯誤的。

使用變數

以下是您在 Kotlin Playground 中執行的原始程式。目前為止,您已瞭解第二行程式碼會建立一個名為 count 且值為 2 的新整數變數。

fun main() {
    val count: Int = 2
    println(count)
}

現在,請查看第三列編碼。您將 count 變數列印出至輸出:

println(count)

請注意,count 這個單字前後是沒有引號的。這是變數名稱,不是字串文字。 (如果它是字串文字,您會在單字周圍找到引號。)運行程式時,Kotlin 編譯器會評估括號內表式 count,也就是 println() 指令。由於表式評估為 2,因此 println() 方法是調入 2 作輸入:println(2)

因此,程式的輸出是:

2

輸出的數字本身並不是很有用。在輸出中,列印更詳細的資料,以解釋 2 的意思,可能更有幫助。

字串範本

以下是在輸出內容中顯示的更實用訊息:

You have 2 unread messages.

如要讓程式輸出更實用的訊息,請按照下列步驟操作。

  1. 使用以下程式碼,在 Kotlin Playground 中更新程式。為 println() 呼叫傳入包含 count 變數名稱的字串常值。請務必在文字前後加上引號。請注意,這樣做無法達到您預期的結果。我們會在稍後的步驟中,修正問題。
fun main() {
    val count: Int = 2
    println("You have count unread messages.")
}
  1. 運行程式,輸出應該會顯示:
You have count unread messages.

「That sentence doesn't make sense! 」您希望在訊息中顯示 count 變數的值,而非變數名稱。

  1. 如要修正輸出內容,需要使用字串範本。以下是一個「字串範本」,因為其中包含「範本運算式」(也就是美元符號 ($)),後面加上變數名稱。系統會對範本運算式求值,然後將值代入到字串內。

使用字串範本的字串

count 變數前方加上美元符號 $。在本例中,範本運算式 $count 的求值結果為 2,並且 2 會代入到字串內運算式所在的位置。

fun main() {
    val count: Int = 2
    println("You have $count unread messages.")
}
  1. 當您執行程式後,輸出內容會符合預期目標:
You have 2 unread messages.

這句對用戶更易於理解!

  1. 現在,請變更 count 變數的初始值為其他整數文字。例如,您可以選擇數字 10。保持程式中其他編碼不變。
fun main() {
    val count: Int = 10
    println("You have $count unread messages.")
}
  1. 運行程式。請注意,輸出會隨之變更,您無須變更程式中的 println() 敘述。
You have 10 unread messages.

您可以查看字串範本的實用程度。您只需在程式碼中編寫一次字串範本 ("You have $count unread messages.")。如果變更 count 變數的初始值,println() 陳述式仍可正常運作。現在,您的程式碼更具靈活性!

為進一步強調這一點,請比較以下兩個程式。第一個程式採用字串常值,直接在字串中使用確切的未讀訊息數量。這個程式僅適用於使用者有 10 則未讀訊息的情況。

fun main() {
    println("You have 10 unread messages.")
}

第二個程式採用變數和字串範本,程式碼就能適用於更多情境。第二個程式更具靈活性!

fun main() {
    val count: Int = 10
    println("You have $count unread messages.")
}

型式推理

您可以在宣告變數時,利用下方的提示,編寫更少的編碼。

類型推論是指 Kotlin 編譯器可以推論 (或判斷) 變數應該採用的資料類型,無須在程式碼中明確編寫類型。也就是說,只要提供變數的初始值,就可以在變數宣告中省略資料類型。Kotlin 編譯器會檢查初始值的資料類型,並假定您希望變數存放該類型的資料。

以下是採用類型推論的變數宣告語法:

此圖顯示在 Kotlin 中採用類型推論的變數宣告語法。變數宣告以單字 val 起始,後面跟著一個空格。它的右邊是一個有標名稱的盒子。名稱盒子右邊有一個空格、等號和另一個空格。右邊是一個標有「initial value」字樣的方塊。

回到 count 範例,程式起初包含以下這行程式碼:

val count: Int = 2

不過,這行程式碼也可以編寫如下。請注意,省略冒號 (:) 和 Int 資料類型。更新後的語法需要輸入的字更少且能達到相同的結果,也就是建立一個名為 countInt 變數,其值為 2

val count = 2

Kotlin 編譯器知道您想將 2 (整數) 儲存至變數 count 內,因此可以推理 count 變數的類型是 Int。很方便,對吧?這是更簡潔的 Kotlin 編碼編寫範例!

儘管這範例只討論 Int 類型的變數,但 Kotlin 中的型式推理概念適用於所有資料類型。

使用整數的基本數學運算

包含 2 值的 Int 變數和包含 "2" 值的 String 變數有何差異?兩者顯示的輸出內容看起來都一樣。

將整數儲存為 Int (而不是 String) 的好處是,您可以使用 Int 變數執行數學運算,例如加法、減法、除法和乘法 (請參閱其他運算子)。舉例來說,您可以將兩個整數變數加起來,取得總和。當然在某些情況下,將整數儲存為字串是合理的做法,但本節的目的是說明 Int 變數的用途。

  1. 返回 Kotlin Playground,在程式碼編輯器中移除所有程式碼。
  2. 建立新程式,為收件匣中未讀的電子郵件數量定義整數變數,並設定初始值,例如 5。您可以根據需要選擇其他數字。為收件匣中的已讀電子郵件數量定義第二個整數變數,並設定初始值,例如 100。您可以根據需要選擇其他數字。接著將兩個整數加起來,在輸出內容中顯示收件匣內的電子郵件總數。
fun main() {
    val unreadCount = 5
    val readCount = 100
    println("You have ${unreadCount + readCount} total messages in your inbox.")
}
  1. 這時執行程式,就應該會顯示收件匣的電子郵件總數:
You have 105 total messages in your inbox.

對於字串範本,您已認識到您可以在單一變數名稱之前,放置這個 $ 符號。但是,如果運算式更加複雜,就必須用大括號括住運算式,並在大括號前方加上 $ 符號:${unreadCount + readCount}。大括號內的運算式 unreadCount + readCount 的求值結果為 105。接著,105 這個值會代入字串常值內。

此圖顯示一個運算式,並在旁邊顯示這個運算式的值。有一個表式標籤,下面寫著:「unreadCount + readCount」。在它的右邊,有一個值標籤,在它下面寫著:105。

  1. 要進一步探索此主題,請以不同名稱和不同初始值建立變數,並使用範列表式,以列印訊息至輸出。

例如,修改您的程式,並列印出來:

100 photos
10 photos deleted
90 photos left

您可以按照下面這種方式編寫程式,也可以使用其他正確的編寫方式!

fun main() {
    val numberOfPhotos = 100
    val photosDeleted = 10
    println("$numberOfPhotos photos")
    println("$photosDeleted photos deleted")
    println("${numberOfPhotos - photosDeleted} photos left")
}

4. 更新變數

應用程式運行時,可能需要更新變數值。舉例來說,用戶在購物應用程式中,將商品加入購物車時,購物車的總金額會增加。

讓我們簡化購物流程,並換為簡單的程式。下面的邏輯是用人類語言來寫的,而不是用 Kotlin 寫的。這種做法稱為「虛擬程式碼」,因為這樣做只會描述如何編寫程式碼的關鍵點,卻不包含程式碼的所有細節。

在程式的 main 函式中:

  • 建立一個起始值為 0 的整數 cartTotal 變數。
  • 用戶將一件價值 20 元的毛衣加入購物車。
  • cartTotal 變數更新為 20,此為現時購物車中的商品總額。
  • 列印購物車中的商品總額 cartTotal 變數至輸出內容。

為了進一步簡化編碼,當用戶將商品加入購物車時,您不需要撰寫這編碼。(您還沒學習程式如何可以回應用戶的輸入。這將會在之後的單元談到。)因此,請將重點放在您建立、更新及列印 cartTotal 變數的部分。

  1. 請使用下列程式,以取代 Kotlin Playground 中的現有編碼。在程式的第 2 列中,您會將 cartTotal 變數初始化為 0。由於您提供了初始值,加上型式推理,所以不需要指定 Int 資料類型,程式的第 3 行會嘗試使用指派運算子 (=),將 cartTotal 變數更新為 20。程式的第 4 行會使用字串範本輸出 cartTotal 變數。
fun main() {
    val cartTotal = 0
    cartTotal = 20
    println("Total: $cartTotal")
}
  1. 運行程式,您會收到編譯錯誤。
  2. 請注意,錯誤訊息表示無法再指定 val。錯誤發生在程式的第三行,試圖將 cartTotal 變數的值變更為 20.。因為 val cartTotal 已有指派的初始值 (0),就無法再指派其他值 (20)。
Val cannot be reassigned

如您需更新變數的值,請使用 Kotlin 關鍵字 var 來宣告變數,而非 val

  • val 個關鍵字 - 當您預期那變數值不會改變時才使用。
  • var 關鍵字 - 當您預期那變數值可能變更時使用。

使用 val 時,變數為 唯讀,這表示您只能讀取或存取變數的值。設定那個值後,您將無法編輯或修改它的值。使用 var 時,變數是 可變的,這代表這個值是可以變更或修改的。那個值可以是可變的。

請視 val 為固定的 ,並視 var變數,以記住當中差異。在 Kotlin 中,建議盡量使用 val 關鍵字,而非 var 關鍵字。

  1. 為第 2 列的 cartTotal 更新變數宣告為使用 var,而非 val。這是編碼的外觀是:
fun main() {
    var cartTotal = 0
    cartTotal = 20
    println("Total: $cartTotal")
}
  1. 請注意,這個語法,是用來更新程式第 3 列編碼的變數。
cartTotal = 20

使用指派運算子 (=) 為現有變數 (cartTotal) 指派新值 (20)。由於變數已經定義,您不必再次使用 var 關鍵字。

此個圖顯示一行程式碼:「cartTotal = 20」,其中有一個箭頭從 20 (位於等號右側) 指向「cartTotal」這個單字 (位於等號左側)。這表示這個值 20 儲存在「cartTotal」變數內。

使用這個盒子類比,想像 20 值儲存在標有 cartTotal 的盒子內。

有一個盒子,它上面寫著「CartTotal」。盒子外面有一個寫著「20」標籤。有一個箭頭從值指向盒子,表示那個值進入盒子內。

下圖表示更新變數的一般語法,這已在先前的一行程式碼中宣告過。您要更新的變數,敘述以變數名稱起始。新增空格和等號,跟隨的是另一個空格。然後寫出變數的更新值。

這圖顯示在 Kotlin 中更新變數的語法。編碼列以有標名稱的盒子超始。名稱盒子右邊有一個空格、等號和另一個空格。右邊是標有「updated value」字樣的一個方塊。

  1. 執行程式,程式碼應該能成功編譯。應該可以列印這輸出:
Total: 20
  1. 如要查看程式執行期間的變數值變化,請在初次宣告變數後,將 cartTotal 變數顯示在輸出內容中。請參閱下方的編碼變更。第 3 列有一個新 println() 敘述。還在編碼的第 4 列新增一條空白列。空白列不會影響編譯器如何解讀編碼。新增一條空白列,以分離相關的碼塊,您便更容易解讀您的編碼。
fun main() {
    var cartTotal = 0
    println("Total: $cartTotal")

    cartTotal = 20
    println("Total: $cartTotal")
}
  1. 再次運行程式,輸出應該如下:
Total: 0
Total: 20

您可以看到購物車初始總金額為 0。然後更新為 20。您已成功更新變數!這可能是因為您將 cartTotal 由唯讀變數 (附 val),變更為可變的變數 (附 var)。

請記得,如果您預期那個值會變化,請只使用 var 來宣告變數。否則,您應該預設使用 val 來宣告變數。這種做法會確保您的編碼更加安全。如果您不希望更新變數,請使用 val 確保變數不會在您的程式中更新。當 val 值被指定後,它就會保持這個值。

遞增和遞減運算子

現在,您知道必須宣告變數為 var,才能更它的值。於下列稔熟的電子郵件範例,應用這些知識。

  1. 以這程式取代 Kotlin Playground 中的編碼:
fun main() {
    val count: Int = 10
    println("You have $count unread messages.")
}
  1. 運行程式。這時應該會輸出以下內容:
You have 10 unread messages.
  1. 取代 val 關鍵字為 var 關鍵字,以將 count 變數設定為可變動的變數。運行程式時,輸出應該沒有變化。
fun main() {
    var count: Int = 10
    println("You have $count unread messages.")
}
  1. 但是,您現在可以更新 count 為不同的值。例如,當收件匣收到一封新電子郵件時,您可以 count 增加 1。(您不需要在收到電子郵件後撰寫編碼。對於後面的單元來說,從網際網路獲取資料是一個比較進階的題目。)現階段,請聚焦在 count 變數,並使用以下列編碼來增加 1
count = count + 1

等號右邊的表式為 count + 1,評估為 11。這是因為目前的 count 值是 10 (位於程式第 2 列),而 10 + 1 等於 11。然後使用指定運算子,指定 11 值或將值儲存在 count 變數中。

此圖顯示了一列編碼:「count = count + 1」,而表式被圈著:「count + 1」。有一個箭頭從圈著的表式(等號的右邊)指向「count」字(等號的左邊)。這表示 count + 1 運算式的值正在儲存到 count 變數中。

在程式中 main() 函式的底部新增下面這行程式碼。您的編碼應該會如下:

fun main() {
    var count = 10
    println("You have $count unread messages.")
    count = count + 1
}

如果現在執行程式,輸出內容會與先前一樣。這是因為您在更新 count 變數後,尚未新增任何使用這個變數的程式碼。

  1. 請新增另一個列印敘述,以在變數更新後,列印未讀郵件的數量。
fun main() {
    var count = 10
    println("You have $count unread messages.")
    count = count + 1
    println("You have $count unread messages.")
}
  1. 運行程式。第二則訊息應該會顯示從 11 封郵件,已更新 count 封郵件。
You have 10 unread messages.
You have 11 unread messages.
  1. 如果想讓變數增加 1,可以使用由兩個加號組成的「遞增運算子」(++) 來簡化程式碼。直接在變數名稱後方使用這些符號,就能指示編譯器將目前的變數值加 1,然後將新值儲存在變數中。以下兩列編碼是等同的,但使用 ++ 遞增運算子涉及較少輸入。
count = count + 1
count++

對您的編碼作此修改,然後運行您的程式。變數名稱與遞增運算子之間不應該有空格。

fun main() {
    var count = 10
    println("You have $count unread messages.")
    count++
    println("You have $count unread messages.")
}
  1. 運行程式。輸出相同,但您現已學會新的運算子!
You have 10 unread messages.
You have 11 unread messages.
  1. 現在可以修改程式第 4 列,並在 count 變數名稱後面,使用 減量運算子 (--)。減量運算子是由兩個減號組成。在變數名稱後方放置遞減運算子,就能指示編譯器將變數值遞減 1,然後將新值儲存在變數中。
fun main() {
    var count = 10
    println("You have $count unread messages.")
    count--
    println("You have $count unread messages.")
}
  1. 運行程式。應該可以列印以下輸出:
You have 10 unread messages.
You have 9 unread messages.

在本節中,您已瞭解如何使用遞增運算子 (++) 和遞減運算子 (--) 更新可變動的變數。具體而言,count++count = count + 1 的結果相同,而 count--count = count - 1 的結果相同。

5. 探索其他資料類型

我們在先前的編碼實驗室中,介紹了幾個常見的基本資料類型:StringIntDoubleBoolean。您剛剛使用的是 Int 資料類型,現在將會探索其他資料類型。

Kotlin 的資料類型

可以儲存什麼類型的資料

String

文字

Int

整數

Double

小數

Boolean

truefalse (僅有兩個可能的值)

請在 Kotlin Playground 中,試用這些程式,看看輸出什麼。

雙倍精度

當您需要含小數的變數,請使用 Double 變數。請參閱 這份表格,以查看用戶為範例可儲存的小數和瞭解它的有效範圍。

假設您要前往某個目的地,由於需要在途中停下來休息,因此將行程分成三個獨立的部分。這個程式會顯示到達目的地前剩餘的總距離。

  1. 在 Kotlin Playground 中輸入這編碼。您知道每一列編碼的內容嗎?
fun main() {
    val trip1: Double = 3.20
    val trip2: Double = 4.10
    val trip3: Double = 1.72
    val totalTripLength: Double = 0.0
    println("$totalTripLength miles left to destination")
}

宣告三個名為 trip1trip2trip3 的變數,以代表旅程各段的距離。因為它們儲存小數值,所以它們全部都是 Double 變數。請使用 val 來宣告每個變數,因為在整個程式中,它們的值都不會改變。程式還會建立名為 totalTripLength 的第四個變數,目前已將初始值設為 0.0。程式的最後一行會輸出內含 totalTripLength 變數值的訊息。

  1. 修正程式碼,將 totalTripLength 變數設為這三個行程長度的總和。
val totalTripLength: Double = trip1 + trip2 + trip3

因為 3.20 + 4.10 + 1.72 等於 9.02,所以等號右邊的表式評估為 9.02。儲存 9.02 的值至 totalTripLength 變數中。

這圖為一列編碼:「val totalTripLength: Double = trip1 + trip2 + trip3」,而表式這部分被圈住:「trip1 + trip2 + trip3」。有一個箭頭從圈住的表達式(等號的右側)指向單字「totalTripLength」(等號的左側)。這表示 trip1 + trip2 + trip3 運算式的值,正在儲存至 totalTripLength 變數中。

整個程式應該如以下程式碼所示:

fun main() {
    val trip1: Double = 3.20
    val trip2: Double = 4.10
    val trip3: Double = 1.72
    val totalTripLength: Double = trip1 + trip2 + trip3
    println("$totalTripLength miles left to destination")
}
  1. 運行程式。輸出內容應該如下所示:
9.02 miles left to destination
  1. 更新程式碼,從變數宣告中移除由於類型推論而變得沒有必要的 Double 資料類型。Kotlin 編譯器可以根據初始值 (提供的是小數) 推論這些變數是 Double 資料類型。
fun main() {
    val trip1 = 3.20
    val trip2 = 4.10
    val trip3 = 1.72
    val totalTripLength = trip1 + trip2 + trip3
    println("$totalTripLength miles left to destination")
}
  1. 再次運行您的編碼,以確保您的編碼仍然可編譯。輸出應該是一樣的,但是您的編碼現在比較簡單!

字串

當您需要可以儲存文本的變數時,請使用 String 變數。請務必在 String 常值前後加上雙引號 (例如 "Hello Kotlin"),但不要在 IntDouble 常值前後加上引號。

  1. 複製這個程式並貼到 Kotlin Playground。
fun main() {
    val nextMeeting = "Next meeting:"
    val date = "January 1"
    val reminder = nextMeeting + date
    println(reminder)
}

請注意,有兩個已宣告的 String 變數、一個nextMeeting 變數和一個 date 變數。然後宣告名為 reminder 的第三個 String 變數,它被設定為等於 nextMeeting 變數加上 date 變數。

您可以使用 + 符號,將兩個字串相加,這稱為「串連」。兩個字串會一個接一個,合併在一起。運算式 nextMeeting + date 的結果是 "Next meeting:January 1",如下方圖表所示。

兩個要串連的字串

接著,程式會使用程式第 4 行的指派運算子,將 "Next meeting:January 1" 這個值儲存至 reminder 變數中。

  1. 運行程式。輸出內容應該如下所示:
Next meeting:January 1

當您將兩個字串連接在一起時,不要在字串之間加入額外空格。如果希望產生的字串在冒號後方有一個空格,則需要在其中一個字串內加上這個空格。

  1. 請更新您的 nextMeeting 變數,讓它在字串末端和關引號前有一個額外的空格。(或者,您可以在 date 變數的開頭,加上一個額外空格)。您的程式應該如下所示:
fun main() {
    val nextMeeting = "Next meeting: "
    val date = "January 1"
    val reminder = nextMeeting + date
    println(reminder)
}
  1. 再次運行您的程式,現在輸出訊息中的冒號後面應該有一個空格。
Next meeting: January 1
  1. 請您修改編碼,以便連接或新增另一段文本至儲存在變數中的表式 reminder 變數中。

使用這 + 符號,以將字串文字 " at work" 加至 reminder 字串的末端。

  1. 運行程式。

應該可以列印以下輸出:

Next meeting: January 1 at work

以下程式碼展示可以實作這項行為的其中一種方式。

fun main() {
    val nextMeeting = "Next meeting: "
    val date = "January 1"
    val reminder = nextMeeting + date + " at work"
    println(reminder)
}

請注意,nextMeetingdate 前後並未加上引號,因為這些是現有字串變數的名稱 (各自的值是由引號括住的文字)。與之相反,常值 " at work" 先前並未在任何變數中定義,因此會在此文字前後加上引號,告知編譯器這個字串應該串連到其他字串。

從技術上,您可以透過使用全文宣告單一 String 變數,而不是使用獨立的變數,以達到相同的輸出。但是,本練習的目的是示範如何宣告和操作 String 變數,特別是如何連接獨立的字串。

  1. 閱讀包含字串的程式碼時,可能會遇到「逸出序列」。逸出順序是前面加上倒斜線符號 (\) 的字元,也稱為逸出倒斜線。

下列是在字串文字中看到 \" 的範例。複製這段程式碼並貼到 Kotlin Playground。

fun main() {
    println("Say \"hello\"")
}

您先前已瞭解如何使用雙引號標註字串常值。但是,如果想在字串中使用 " 符號,該怎麼辦?這時,請在雙引號前方加上反斜線符號,在字串中標示為 \"。請注意,整個字串仍應使用英文雙引號引起來。

  1. 執行程式來查看輸出。結果應該如下所示:
Say "hello"

在輸出內容中,hello 的兩端會用英文雙引號引起來,這是因為 println() 陳述式的 hello 前後兩端都加上了 \"

如要瞭解 Kotlin 支援的其他逸出序列,請參閱有關逸出序列的說明文件頁面。舉例來說,如果想為字串新增一行,可在 n 這個字元前方加上 \ 符號,也就是 \n

現在,您已經學會串連字串,以及字串中的逸出序列。轉到這編碼實驗室涵蓋的最後資料類型。

布林

當您的變數只有 truefalse 代表的兩個可能值時,Boolean 資料類型就很有用。

例如,使用變數代表飛航模式處於開啟還是關閉狀態,或者應用程式的通知功能處於啟用還是停用狀態。

  1. 在 Kotlin Playground 中輸入這編碼。在這程序的第 2 列中,您宣告了一個名為 notificationsEnabledBoolean 變數,並初始化這個變數為 true。從技術上,您可以在宣告中省略 : Boolean,因此您可以根據自己的意願來移除它。在程式的第 3 列中,您列印出這 notificationsEnabled 變數的值。
fun main() {
    val notificationsEnabled: Boolean = true
    println(notificationsEnabled)
}

運行程式,然後列印出來的應該如下:

true
  1. 變更在程式第 2 列的 Boolean 初始值為 false。
fun main() {
    val notificationsEnabled: Boolean = false
    println(notificationsEnabled)
}

運行程式,然後列印出來的應該如下:

false
  1. 其他資料類型可以連接到 Strings。例如,您可以連接 BooleansStrings。使用這 + 符號,以連接 (或附加) notificationsEnabled 布林變數的值到 "Are notifications enabled? " 字串的末端。
fun main() {
    val notificationsEnabled: Boolean = false
    println("Are notifications enabled? " + notificationsEnabled)
}

運行程式,以查看連接結果。程式應該列印的輸出如下:

Are notifications enabled? false

您可以看到將 Boolean 變數設定為 truefalse 值。您可以使用 Boolean 變數為更多有趣的情境寫程式,在 Boolean 變數值為 true 時,執行特定指令組合。或者,如果 Boolean 有一個假值,則可跳過這些指令。在後續的程式碼實驗室中,我們會詳細說明 Booleans

6. 程式設計慣例

我們在先前的程式碼實驗室介紹了 Kotlin 樣式指南,這是 Google 推薦使用並且其他專業開發人員也在遵循的 Android 程式碼統一撰寫方式。

對於所學的新主題,您還需要遵循另外一些格式設定和程式設計慣例:

  • 變數名稱應為駝峰式大小寫,開頭字母必須小寫。
  • 您在變數宣告中指定資料類型時,冒號後面應該有一個空格。

此圖顯示一行程式碼:「val discount: Double = .20」,其中有一個附帶「space」標籤的箭頭,指向冒號與「Double」資料類型之間的空格。

  • 指派 (=)、加法 (+)、減法 (-)、乘法 (*) 和除法 (/) 等運算子的前後都應該加上空格。

此圖顯示一行程式碼:var pet =

此圖顯示一行程式碼:val sum = 1 + 2,其中有兩個附帶「space」標籤的箭頭,指向加號前後的空格。

  • 編寫更複雜的程式時,建議每行不要超過 100 個字元。這項限制可確保您在電腦螢幕上輕鬆閱讀程式中的所有程式碼,無須在閱讀程式碼時水平捲動畫面。

7. 在編碼中加註解

進行程式設計時,您可以依循的另一個好做法是,加上「註解」說明程式碼的用途。註解可幫助閱讀程式碼的使用者更容易理解。兩個正斜線符號 (或 //) 表示系統會將這一行中符號後方的其餘文字視為註解,因此不會解讀為程式碼。一般做法是在兩條斜線後面加上空格。

// This is a comment.

註解也可以從一列編碼的中間開始。在以下範例中,height = 1 是一般的程式設計陳述式。系統會將 // Assume the height is 1 to start with 解讀為註解,不會將其視為程式碼。

height = 1 // Assume the height is 1 to start with

如果想在一行中使用超過 100 個字元的長註解來詳細說明程式碼,請使用多行註解。請在多行註解的開頭加上正斜線 (/) 和星號 (*),也就是 /*;在每行註解的開頭加上星號。最後,用星號和斜線 */ 來結束註釋。

/*
 * This is a very long comment that can
 * take up multiple lines.
 */

這程式包含描述正在發生事情的單列和多列註釋:

/*
 * This program displays the number of messages
 * in the user's inbox.
 */
fun main() {
    // Create a variable for the number of unread messages.
    var count = 10
    println("You have $count unread messages.")

    // Decrease the number of messages by 1.
    count--
    println("You have $count unread messages.")
}

如前所述,您可以在編碼中新增空白列,將相關敘述組合在一起,使編碼更容易閱讀。

  1. 請在早前使用的編碼片段中加上一些註解。
  2. 執行程式來確認行為維持不變,因為註解不應影響輸出內容。

8. 結語

很捧!您已經暸解 Kotlin 中的變數、變數在程式設計中相當實用的原因,以及如何建立、更新及使用變數。您在 Kotlin 中測試了不同的基本資料類型,包括 IntDoubleStringBoolean 資料類型。您還瞭解 valvar 關鍵字之間的差異。

所有這些概念都是您在成為開發者的旅程上,關鍵的構建塊。

下一個編碼實驗室見!

摘要

  • 變數是單一資料的容器,
  • 您必須先宣告變數,才能使用變數。
  • 使用 val 關鍵字來定義唯讀變數,而它的值在指定後是無法變更。
  • 使用 var 關鍵字來定義可變的或常變的變數。
  • 在 Kotlin 中,建議盡可能使用 val 而非 var
  • 如要宣告變數,請開頭使用 valvar 關鍵字開始。然後指定變數名稱、資料類型和初始值。例如:val count: Int = 2
  • 使用類型推論時,如果有提供初始值,則在變數宣告中省略資料類型。
  • 常見的基本 Kotlin 資料類型包括:IntStringBooleanFloatDouble
  • 宣告或更新變數時,使用指定運算子 (=) 為變數指定值。
  • 您必須先將變數宣告為可變動的變數 (使用 var),才能進行更新。
  • 使用增量運算子 (++) 或減量運算子 (--),將整數變數的值增加或減少 1。
  • 使用 + 符號將字串連接在一起。您還可以將其他資料類型,例如 IntBoolean,連接到 Strings

瞭解詳情