在 Kotlin 中建立和使用變數

1. 事前準備

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

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

這是「設定」應用程式的螢幕截圖,顯示變更裝置「設定」的各個功能表選項。螢幕上顯示的功能表選項包括:「網路與網際網路」、「已連結的裝置」、「應用程式」、「通知」、「電池」、「儲存空間」、「音效與震動」和「螢幕顯示」。

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

那您如何編寫程式,讓內容隨著時間改變?您不可能在每次要發布新文章時重新撰寫應用程式,因為每天、每小時甚至每分鐘都會有新文章!

您在這編碼實驗室,將會學到怎樣編寫利用變數的程式,從而程式某些部分可以變動,而無需編寫一套全新的指令。您將會如在先前的編碼實驗室,同樣使用 Kotlin Playground。

建立什麼

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

課程內容

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

軟硬體需求

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

2. 變數和資料類型

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

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

當您可以簡單地直接使用那個值時,為什麼要將值儲存在一個盒子內,並以盒子的名稱引用那個盒子呢?問題在於,當您的編碼於所有指令中直接使用值時,您的程式將僅適用於該特定情況。

這是讓您更容易解讀變數為何有用的比喻。以下是給您近期會面人物的信件,

Lauren,您好:

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

祝您愉快!

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

親愛的 ____:

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

祝您愉快!

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

親愛的 { name }:

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

祝您愉快!

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

這圖示為新聞應用程式的範例,畫面中的內容開頭是歡迎訊息,當中姓名部分空白,是使用者真實姓名的預留位置。然後,顯示「您的最新消息」之類的文字。無論應用程式載入怎樣的報導,這段文字都維持不變。然後,為每篇新報導提供一列,當中為圖片、標題、日期和來源,預留了位置。報導列表底部設置一個按鈕,上面寫著「查看更多新聞」。

以上新聞應用程式的圖示中,「歡迎」辭、「給您的最新消息」標題和「查看更多新聞」按鈕文字是維持不變的。然而,使用者名字與每篇報導的內容都會有所變更。因此,這是使用變數來為每種資訊預留位置的好機會。

這圖示內有 3 個盒子,並排成一列。第一個盒子被稱為「名稱」。它旁邊有一張標示「Alex」的標籤。有一個箭頭從「Alex」指向盒子,這表示「Alex」這個值,儲存在名為「名稱」的盒子裡。第二個盒子被稱為「報導 1 標題」。它旁邊有一張標示「新電影上映」的標籤。有一個箭頭從「新電影上映」字串指向第二個盒子。這表示「新電影上映」的值,會儲存在名為「報導 1 標題」的盒子裡。第三個盒子被稱為「報導 1 日期」。它旁邊有一張標示「6 月 9 日」的標籤 有一個箭頭從「6 月 9 日」指向第三個盒子。這表示「6 月 9 日」的值,會儲存在名為「報導 1 日期」的盒子裡。

您不希望編寫新聞應用程式 (或指令),只為只為名為「Alex」的使用者使用或新報導一直使用相同標題和發布日期。然而,您需要一個更靈活的應用程式,並因此您應該以引用變數名稱來寫編碼,例如 namearticle1Namearticle1Date 等。您的編碼因此變得非專門的,可以用於不同使用者名稱和報導內容的各個情況。

利用變數的應用程式範例

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

這 Google 地圖應用程式螢幕截圖,顯示 Googleplex 位置的詳細資料。這企業園區被稱為 Google 全球總部。這地點由 9,831 個評分而得到 4.2 顆星。地址為 1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA。用戶可於他們列表中儲存這些資料。

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

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

只要更改儲存在這些變數中的資料,您便可有一個靈活的地圖應用程式,它可以顯示其他地點的詳細資料。

資料類型

當您決定應用程式的那些方面是變數時,請務必規定那些資料類型可以儲存在變數中。在 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 資料類型,那您之前看到的位置詳細資料頁面中,每個已確定的變數,適合哪種資料類型?

這 Google 地圖應用程式螢幕截圖,顯示 Googleplex 位置的詳細資料。這企業園區被稱為 Google 全球總部。這地點由 9,831 個評分而得到 4.2 顆星。地址為 1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA。用戶可於他們列表中儲存這些資料。

  • 位置的 名稱 是文字,因此可儲存在資料類型為 String. 的變數中。
  • 地點的 星級評價 是小數 (例如 4.2 顆星),因此可以儲存為 Double
  • 地點的 評論數量 是整數,因此應該以 Int 的形式儲存。
  • 這使用者是否 儲存 那個位置有兩個可能的值 (已儲存或未儲存),因此會儲存為 Boolean,而其中 truefalse 可以代表各個狀態。
  • 地點的 地址 是文字,因此應該是 String
  • 地點的 描述 也是文字,因此應為 String

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

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

這螢幕截圖顯示 YouTube 應用程式正在播放影片,而這部影片的名稱是「Android Developers 訂閱人數突破 100 萬!」該主題發布至 Android Developers YouTube 頻道。這影片觀看次數為 6,900,並有 541 個讚和 68 個留言。

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

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

這 Gmail 應用程式螢幕截圖,顯示用戶的收件匣郵件清單。收件匣有 1 封來自 Mary Joe 的郵件。電郵主旨是「本週末」。您可以為電子郵件加上星號。

同樣,沒有單一正確答案。在電子郵件應用程式中,變數可用於下列資料:

  • 寄件者的 名稱 (String)
  • 電郵的 主旨 (String)
  • 電郵是否 加上星號 (Boolean)
  • 收件匣的 新郵件數量 (Int)

試用

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

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

3. 定義和使用變數

定義和使用變數

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

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

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

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

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

每當您的編碼需要存取未讀郵件的數量時,請在您的編碼中輸入 count。當您運行指示時,Kotlin 編譯器會在您的編碼中,看見變數名稱,並在變數值所在位置,使用變數值。

在技術上,您需要更具體的詞彙來描述這過程:

表式 是一組含有值的小編碼單元。表式可以由變數、函數呼叫和其他組成。在下列範例中,表式 是由一個變數組成:count 變數。表式的值是 2

此圖顯示一個表式在它自己值的旁邊。有一個表式標籤,它的下方寫著:count。在它的右邊,有一個值標籤,標籤下方寫著:2。

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

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

如果要在 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 內的語法。變數宣告以文字值起始,然後是一個空格。它的右邊是一個有標名稱的盒子。盒子名稱的右邊是冒號。冒號後還有一個空格,然後是一個有標資料類型的盒子。在這盒子的右邊,有一個空格和等號,然後是另一個空格。右邊是一個有標初始值的盒子。

count 變數範例的情境,您可以看到變數宣告的首字母是 val。這個變數的名稱是 count。資料類型是 Int,而初始值是 2

這圖顯示一列編碼:「val count: Int = 2」。當中有幾個箭頭指向那個編碼中,說明編碼有什麼的部分。在編碼內,有一個指向「count」字的名稱標籤。有一個資料類型標籤,指向編碼中「Int」這個字。有一個起始值標籤指向編碼中的數字 2。

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

定義新變數的關鍵字

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

變數名稱

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

此圖顯示宣告變數在 Kotlin 內的語法。變數宣告以文字值起始,然後是一個空格。它的右邊是一個有標名稱的盒子。名稱盒子會以綠色邊框和綠色底色強調顯示,讓用戶注意到這變數宣告的這個部分。盒子名稱的右邊是冒號。冒號後還有一個空格,然後是一個有標資料類型的盒子。在這盒子的右邊,有一個空格和等號,然後是另一個空格。右邊是一個有標初始值的盒子。

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

最好選擇一個描述變數所儲存資料的名稱,以便讀取您的編碼。

變數名稱應該以駝峰式命名,就如您從函數名稱學到的一樣。變數名稱的第一個字是小寫。如果名稱中出現多個字,字之間不可以是空格,而所有其他字的首字母都必須是大寫字母。

變數名稱範例:

  • numberOfEmails
  • cityName
  • bookPublicationDate

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

val count: Int = 2

變數資料類型

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

此圖顯示宣告變數在 Kotlin 內的語法。變數宣告以文字值起始,然後是一個空格。它的右邊是一個有標名稱的盒子。盒子名稱的右邊是冒號。冒號後還有一個空格,然後是一個有標資料類型的盒子。資料類型盒子會以綠色邊框和綠色背景強調顯示,讓用戶注意到這部分是這變數宣告。資料類型的右邊有一個空格和等號,然後是另一個空格。右邊是一個有標初始值的盒子。

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

val count: Int = 2

指定運算子

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

這圖顯示一列「val count: Int = 2」的編碼,其中有一個箭頭從「2」(在等號的右邊) 指向「count」單字 (等號的左邊)。這表示值 2 正儲存在「count」變數中。

變數初始值

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

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

對於 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 變數之前加上錢幣記號 $"You have $count unread messages." 這是一個「字串範本」,因為其中包含「範本表式」,在本範例中即為 $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 count: Int = 2

不過,這列編碼也可以如下編寫。請注意,省略冒號 (:) 和 Int 資料類型。更新後的語法需要輸入的字數更少,並且達到與建立一個 Int 變數的相同結果,而變數的名稱是 count,它的值是 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 寫的。這個方法稱為虛擬程式碼,因為它描述如何編寫程式碼的關鍵點,但它並不包含程式碼的所有細節。

虛擬程式碼在程式中的主要功能:

  • 建立一個起始值為 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.。當它指定初始值 (0),val cartTotal 不可以再指定給其他值 (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 中更新變數的語法。編碼列以有標名稱的盒子超始。名稱盒子右邊有一個空格、等號和另一個空格。右邊則是標有更新值的盒子。

  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 變數。請記住在字串文字值,例如 "Hello Kotlin",使用引號。然而,IntDouble 文字值則沒有引號。

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

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

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

該圖旨在表示表式「nextMeeting + date」評估為「下一場會議是:1 月 1 日」。表式「nextMeeting + date」被圈起來,並有一個箭頭從表式指向值「下一次會議是:1 月 1 日」。這箭頭有標「evaluates to」這片語。

然後,使用程式第 4 列的指定運算子,將這個值 "Next meeting is:January 1" 儲存至 reminder 變數中。

  1. 運行程式。應該可以列印以下輸出:
Next meeting is:January 1

當您將兩個字串連接在一起時,不要在字串之間加入額外空格。如果您希望在結果字串的冒號後有一個空格,則需要將空格加到一個字串或其他字串。

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

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

  1. 運行程式。

應該可以列印以下輸出:

Next meeting is: January 1 at work

以下編碼為您展示一種您可以實施那個行為的方法。

fun main() {
    val nextMeeting = "Next meeting is: "
    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"

在輸出內容中,由於 println() 陳述式的 hello 前後兩端都有加上 \",因此 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 變數有 true 值的指示時,Boolean 變數可以讓您編寫更多有趣的情境。或者,如果 Boolean 有一個假值,則可跳過這些指令。您會在未來編碼實驗室瞭解更多 Booleans

6. 編碼慣例

我們在先前的編碼實驗室介紹過 Kotlin 式樣導引,以協助您按照 Google 建議和其他專業開發者使用的方法,來撰寫 Android 程式碼。

根據您學到的新主題,您可以使用以下其他格式和編碼規約:

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

該圖顯示一列程式碼:「val discount: Double = .20」。在冒號和「Double」資料類型之間,有一個標有「空格」和指向空格的箭頭。

  • 指定(=)、加法 (+)、減法 (-)、乘法 (*)和除法 (/)等運算子的前後,應該有一個空格。

此圖顯示一列程式碼:「var pet = "bird"」,而等號前後都有一個標有「空格」和指向空格的箭頭。

該圖顯示一列程式碼:「val sum = 1 + 2」,而加號前後都有一個標有「空格」和指向空格的箭頭。

  • 當您編寫更複雜的程式時,建議 每列最多 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

瞭解詳情