您的第一個 Kotlin 程式

1. 事前準備

Android 與 Kotlin 標誌

在本課程中,您將使用 Kotlin 程式設計語言編寫程式碼以建構應用程式;此為 Google 在製作新的 Android 應用程式時建議使用的程式設計語言。

Kotlin 是一種現代程式設計語言,有助開發人員提升效率。舉例來說,與其他程式設計語言相比,使用 Kotlin 就能用更簡潔的程式碼達到相同功能,藉此減少程式碼的行數。使用 Kotlin 建構的應用程式較不容易當機,對使用者而言更為穩定可靠。基本上,有了 Kotlin,您可以在更短的時間內編寫出更出色的 Android 應用程式。因此,Kotlin 不僅在業界中創下佳績,也是大部分 Android 專業開發人員的慣用語言。

如要開始在 Kotlin 中建構 Android 應用程式,首先要在 Kotlin 程式設計概念打下穩固基礎。透過本課程的程式碼研究室,您會先瞭解 Kotlin 程式設計的基本知識,然後再深入學習如何建立應用程式。

建構項目

  • 使用 Kotlin 編寫簡短程式,在執行時顯示訊息。

課程內容

  • 如何編寫並執行簡單的 Kotlin 程式。
  • 如何修改簡單的程式來變更輸出內容。

需求條件

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

2. 立即開始

在本程式碼研究室中,您會探索並修改簡單的 Kotlin 程式。您可以將程式視為一系列指示電腦或行動裝置執行某些動作的操作說明,例如向使用者顯示訊息,或是計算購物車中商品的費用。指示電腦應執行的操作的逐步操作說明稱為程式碼。修改程式中的程式碼時,輸出結果可能有變。

您可以使用名為程式碼編輯器的工具來編寫和編輯程式碼。程式碼編輯器與文字編輯器類似,可讓您編寫和編輯文字。不過,程式碼編輯器還提供讓您更準確地編寫程式碼的功能。舉例來說,程式碼編輯器會在您輸入內容時顯示自動完成建議,並在程式碼不正確時顯示錯誤訊息。

如要練習 Kotlin 語言的基本知識,請使用名為 Kotlin Playground 的互動式程式碼編輯器。您可以透過網路瀏覽器存取此工具,無須在電腦上安裝任何軟體。您可以直接在 Kotlin Playground 中編輯及執行 Kotlin 程式碼,並查看輸出內容。

請注意,您無法在 Kotlin Playground 中建構 Android 應用程式。在後續課程中,您要安裝並使用名為 Android Studio 的工具來編寫及編輯 Android 應用程式的程式碼。

現在,您已掌握了一些 Kotlin 的背景脈絡,接下來讓我們看看第一個程式!

3. 開啟 Kotlin Playground

使用電腦上的網路瀏覽器開啟 Kotlin Playground

顯示的網頁應如下圖:

這顯示 Kotlin Playground 的螢幕截圖。程式碼編輯器會顯示一個簡單的程式,讓您將「Hello, world!」列印為輸出內容。

程式碼編輯器中已預先填入部分預設程式碼。這三行程式碼組成一個簡單的程式:

fun main() {
    println("Hello, world!")
}

即使您從來沒試過程式設計,您能猜出這個程式的用途嗎?

繼續閱讀下一節,看看您的猜測是否正確!

4. 執行您的第一個程式

按一下 執行按鈕 即可執行程式。

按一下「Run」按鈕後,系統會進行許多操作。Kotlin 程式設計語言的程式碼易於讓人理解,因此使用者可以輕鬆閱讀和編寫 Kotlin 程式,並與他人協同合作。不過,您的電腦不會立即瞭解這個語言。

您需要名為 Kotlin 編譯器的工具,它會擷取您編寫的 Kotlin 程式碼、逐行查看程式碼,以及將其轉譯成電腦能夠理解的內容。這個過程稱為編譯程式碼。

如果程式碼編譯成功,程式就會執行。電腦執行程式時,它會執行每個指令。這就好比您照著食譜烹調,那麼按照食譜完成每個步驟就視為執行每一個指令。

以下螢幕截圖顯示您在執行程式時應會看到的內容。

此螢幕截圖顯示 Kotlin Playground 的一部分網頁。程式碼編輯器會顯示 Hello World 程式的程式碼。程式碼編輯器下方是輸出窗格,顯示「Hello, world!」詞組。

程式碼編輯器底部會顯示一個窗格,其中顯示程式的輸出內容或結果:

Hello, world!

太棒了!本程式的目的是輸出或顯示內容為 Hello, world! 的訊息。

運作方式Kotlin 程式必須具備 main 函式,這是 Kotlin 編譯器在程式碼中開始編譯的指定位置。主函式是程式的進入點,也可以說是起點。

在標有「Start Here」的簡易程式中,有一個箭頭指向主函式的第一行。

您現在可能會好奇,函式是什麼?

5. 函式的組成部分

函式是程式中執行特定工作的部分。您的程式中可以包含多個函式,也可以只有一個函式。

定義與呼叫函式

您必須在程式碼中定義函式,也就是說,您要指定執行該工作所需的各項指示。

定義函式後,您就可以呼叫函式,以便執行該函式中的指示。

比方說,您編寫下巧克力蛋糕烘焙方法的逐步指令,您可以將這組指令命名為:bakeChocolateCake。每次需要烤蛋糕時,都可以執行 bakeChocolateCake 指令。如要您想要 3 個蛋糕,就必須執行 bakeChocolateCake 指令 3 次。第一步是定義步驟並指定名稱,這相當於定義函式。接下來,您可以隨時參考執行步驟,這相當於呼叫函式。

定義函式

以下是定義函式所需的關鍵部分:

  • 函式需要名稱,方便日後呼叫它。
  • 函式還可能需要一些輸入內容,或是呼叫函式時需要提供的資訊。函式會使用這些輸入內容來達到目的。輸入內容並非必需,有些函式並不需要輸入內容。
  • 函式還有主體,其中包含執行工作的指令。

此圖表代表一個函式,黑色方塊上有「名稱」標籤,代表函式名稱。函式方塊內一個稱為「主體」的小型方塊,代表函式內的函式主體。還有一個稱為「輸入內容」的標籤,有一個箭頭指向函式黑色方塊,代表函式輸入內容已傳遞到函式中。

如要將上圖轉譯為 Kotlin 程式碼,請按照下列語法或格式來定義函式。這些元素的順序十分重要。「fun」字必須排在函式名稱後面,接著是加上括號的輸入內容,最後是加上大括號的函式主體。

此圖表顯示在 Kotlin 程式碼中宣告函式的語法 (或格式)。函式以「fun」一詞開頭。其右側有一個標示「名稱」的方塊。名稱方塊右側是標示「輸入內容」的方塊,並加上括號。然後,輸入內容是左大括號。下一行是標示「主體」方塊,右邊已縮排。在函式底部的主體之後是右大括號。

請注意,您在 Kotlin Playground 中看到的主函式例子中,函式的主要部分為:

  • 函式定義以字詞 fun 開頭。
  • 然後,函式名稱是 main
  • 函式沒有輸入內容,因此括號內是空白。
  • 函式主體 println("Hello, world!") 中有一行程式碼,位於函式左右大括號之間。

圖片中顯示的主函式程式碼如下:fun main() {     println("Hello, world!") } 有一個名為「名稱」的標籤指向字詞 main。有一個名為「輸入內容」的標籤指向左右括號符號。有一個名為「主體」的標籤,指向 println (「Hello, world!」) 的程式碼行。

下文會更詳細說明函式的各個部分。

函式關鍵字

為了表示您即將在 Kotlin 中定義函式,請在新行中使用 fun 這個特殊字詞。您輸入的 fun 必須與顯示的單字完全相同,而且全部用小寫。您不能「func」、「function」或其他拼寫方式,因為 Kotlin 編譯器無法識別您的意思。

這類特殊字詞在 Kotlin 中稱為關鍵字,只能用於特定用途,例如在 Kotlin 中建立新函式。

函式名稱

函式需要用名稱來區分,好比人要用名字來識別身分。函式的名稱會顯示在 fun 關鍵字之後。

此圖表顯示在 Kotlin 程式碼中宣告函式的語法 (或格式)。函式以「fun」一詞開頭。其右側有一個標示「名稱」的方塊。名稱方塊會以綠色邊框和背景醒目顯示,突顯這是函式定義的部分。名稱方塊右側是標示「輸入內容」的方塊,並加上括號。然後,輸入內容是左大括號。下一行是標示「主體」方塊,右邊已縮排。在函式底部的主體之後是右大括號。

請根據函式用途,為函式選擇恰當的名稱。名稱通常是動詞或動詞片語。建議您避免使用 Kotlin 關鍵字做為函式名稱。

函式名稱應遵循駝峰式大小寫規範,其中函式名稱的第一個字詞全為小寫。如果名稱中包含多個字詞,字詞之間不應有空格,所有其他字詞的首字母都應用大寫。

函式名稱範例:

  • calculateTip
  • displayErrorMessage
  • takePhoto

函式輸入內容

請注意,函式名稱後面一律加上括號。函式的輸入內容應列在這些括號內。

此圖表顯示在 Kotlin 程式碼中宣告函式的語法 (或格式)。函式以「fun」一詞開頭。其右側有一個標示「名稱」的方塊。名稱方塊右側是標示「輸入內容」的方塊,並加上括號。輸入內容方塊會以綠色邊框和背景醒目顯示,突顯這是函式的部分。然後,輸入內容是左大括號。下一行是標示「主體」方塊,右邊已縮排。在函式底部的主體之後是右大括號。

輸入內容是函式執行其目的所需的資料。定義函式時,您可以要求系統在呼叫函式時傳遞特定輸入內容。如果函式無需輸入內容,則括號會顯示空白的 ()

以下列舉幾種含有不同輸入內容的函式:

下圖顯示名為 addOne 的函式。函式的作用是為指定數字加上 1。該函式有一個輸入內容,也就是指定數字。在函式主體內,有程式碼將 1 加到傳遞至函式𥫩數字上。

此圖表代表一個函式,黑色方塊上有「addOne」標籤,代表函式名稱。函式方塊內是一個小型方塊,代表函式主體。函式主體方塊內,有一段「數字 + 1」的文字。在函式黑色方塊外,有一個標示「數字」的方塊,並有箭頭指向函式黑色方塊。數字就是函式的輸入內容。

在下一個例子中,有一個名為 printFullName 的函式。該函式需要兩個輸入內容,一個是名字,另一個是姓氏。該函式主體會輸出輸出內容中的名字和姓氏,以顯示對方的全名。

此圖表代表一個函式,黑色方塊上有「printFullName」標籤,代表函式名稱。函式方塊內是一個小型方塊,代表函式主體。函式主體方塊內,有一段「Print firstName and lastName in the output」的文字。在函式黑色方塊外,有兩個分別標示為「firstName」和「lastName」的方塊。「firstName」和「lastName」方塊都有箭頭,指向函式黑色方塊。firstName 和 lastName 是函式的兩個輸入內容。

這最後一個例子中,顯示在呼叫函式時,函式不需要任何輸入內容就能傳遞。當您呼叫 displayHello() 函式時,系統會輸出 Hello 訊息到輸出內容。

此圖表代表一個函式,黑色方塊上有「displayHello」標籤,代表函式名稱。函式方塊內是一個小型方塊,代表函式主體。函式主體方塊內,有一段「Print Hello in the output」的文字。

函式主體

函式主體包含達成函式目的所需的指令。您可尋找以左右大括號包起來的函式。

此圖表顯示在 Kotlin 程式碼中宣告函式的語法 (或格式)。函式以「fun」一詞開頭。其右側有一個標示「名稱」的方塊。名稱方塊右側是標示「輸入內容」的方塊,並加上括號。然後,輸入內容是左大括號。下一行是標示「主體」方塊,右邊已縮排。主體方塊會以綠色邊框和背景醒目顯示,突顯這是函式的部分。在函式底部的主體之後是右大括號。

簡單程式說明

請回顧先前在程式碼研究室中會看到的簡易程式。

圖片中顯示的主函式程式碼如下:fun main() {     println("Hello, world!") } 有一個名為「名稱」的標籤指向字詞 main。有一個名為「輸入內容」的標籤指向左右括號符號。有一個名為「主體」的標籤,指向 println (「Hello, world!」) 的程式碼行。

程式含有一個函式:主函式。主函式是 Kotlin 中的特殊函式名稱。當您在 Kotlin Playground 中編寫程式碼時,程式碼應在 main() 函式中編寫,或是從 main() 函式呼叫。

這個 main() 函式的內文只有一行程式碼:

println("Hello, world!")

這段程式碼是陳述式,因為會執行特定動作,也就是在輸出窗格中輸出 Hello, world! 文字。具體來說,我們在這行程式碼中呼叫 println() 函式。println() 是已在 Kotlin 語言中定義的函式。也就是說,建立 Kotlin 語言的工程師團隊已編寫 println() 函式的函式宣告。該函式需要一個輸入內容,也就是應輸出的訊息。

呼叫 println() 函式時,請將訊息文字放在函式名稱之後的括號中。請務必在文字前後加上引號,例如 "Hello, world!"

程式執行時,傳遞至 println() 函式的訊息會輸出到輸出內容中:

Hello, world!

試試看

現在請查看程式中的原始程式碼。您是否能修改 Kotlin Playground 中的程式碼,改為顯示這則訊息?

Hello, Android!

6. 修改程式

  1. 如要變更輸出結果中顯示的訊息,請修改程式第二行的 println() 函式呼叫。以 Android 取代 println() 函式中的 world。確認 "Hello, Android!" 仍位於引號和括號內。
fun main() {
    println("Hello, Android!")
}
  1. 執行程式。
  2. 輸出結果應顯示下列訊息:
Hello, Android!

做得好,您已修改了第一個程式!

現在,您可以變更程式碼,讓訊息輸出兩次嗎?查看偏好的輸出內容:

Hello, Android!
Hello, Android!

您可以根據工作需求,在函式中新不限行數的指令。不過請注意,在 Kotlin 中,每行只能有一個陳述式。如要編寫其他陳述式,則應在函式中另起新一行。

如要變更程式以輸出多行文字,請按照以下步驟操作:

  1. 複製初始 println() 陳述式,並將第二個陳述式貼到函式主體中。兩個 println() 陳述式都必須包含在主函式的大括號內。現在,函式主體內有兩個陳述式。
fun main() {
    println("Hello, Android!")
    println("Hello, Android!")
}
  1. 執行程式。
  2. 執行程式時,輸出內容應如下所示:
Hello, Android!
Hello, Android!

您可以看到程式碼對輸出內容的影響。

  1. 變更代碼,使其顯示 Hello, YOUR_NAME!

7. Kotlin 樣式指南

在本課程中,我們會說明 Android 開發人員在寫程式時應遵循的幾個良好做法。其中一種做法是遵循 Google 對使用 Kotlin 編寫程式碼制定的 Android 程式碼設計標準。這份完整指南稱為樣式指南,從程式碼的視覺外觀和寫程式規範方面應採用的格式。例如,樣式指南包括使用空白字元、縮排和命名等方面的建議。

遵循樣式指南的目的是讓程式碼更易讀,並且與其他 Android 開發人員編寫程式碼的方式更加一致。在大型專案的協同合作中,這種一致性非常重要,能確保專案中所有檔案的程式碼都採用相同樣式。

對於您目前為止學到的 Kotlin 知識,我們有下列的相關樣式指南建議:

  • 函式名稱應採用駝峰式大小寫形式,且應為動詞或動詞片語。
  • 每個陳述式應單獨一行。
  • 左大括號應顯示在函式開始行的末尾。
  • 左大括號前應有一個空格。

圖片中顯示的主函式程式碼如下:fun main() {     println("Hello, world!") } 有一個名為「空間」的標籤,指向括號之後及左括號之前的空格。

  • 函式主體應縮排 4 個空格。請勿使用定位字元縮排程式碼,而是輸入 4 個空格。

圖片中顯示的主函式程式碼如下:fun main() {     println("Hello, world!") } 有一個箭頭指向下列函式主體的程式碼行:println("Hello, world!”)。箭頭上的標籤顯示:用 4 個空格縮排。

  • 右大括號位於函式主體的最後一行程式碼,並單獨一行。右括號應與函式開頭的 fun 關鍵字對齊。

圖片中顯示的主函式程式碼如下:fun main() {     println("Hello, world!") } 函式程式碼的左側會顯示一條垂直線,位於「fun」字詞左側,並垂直延伸超過函式的右大括號。垂直線標籤上顯示:垂直對齊。此線條旨在表示單字「fun」應與右大括號垂直對齊。

在進一步瞭解 Kotlin 知識的過程中,您會學到更多 Android 程式設計的慣例。請參閱這裡的完整樣式指南。不過,如果其中有您未學過的 Kotlin 主題,也無需擔心。

8. 修正程式碼中的錯誤

學習人類語言時,單字的正確使用方式和句子的正確結構都有一定的語法和文法規則。同樣,在程式設計語言中,有效的程式碼也要符合特定的規範,也就是說,能成功編譯程式碼。

在程式設計過程中,出錯和不慎編寫住效的程式碼很正常。新手在遇到這些錯誤時可能會感到困惑或沮喪,不過您不必擔心,這是正常現象。程式碼很少編寫一次時就能完美運作。就像撰寫文件也需要擬定多份草稿一樣,編寫程式碼也可能需要多次疊代,直到程式碼達到預期的效果。

如果程式碼無法順利編譯,就會發生錯誤。舉例來說,如果您有錯字 (例如缺少引號或括號),編譯器會無法理解您的程式碼,也無法將其轉換成由電腦執行的步驟。如果程式碼無法如預期般運作,或是您的程式碼編輯器顯示錯誤訊息,就必須檢查程式碼並加以修正。解決這些錯誤的程序稱為疑難排解

  1. 複製以下程式碼片段並貼到 Kotlin Playground,然後執行程式。您看到什麼?
fun main() {
    println("Today is sunny!)
}

在理想情況下,系統會顯示 Today is sunny! 訊息。不過在輸出窗格中,看到的卻是有錯誤訊息的驚嘆號圖示。

執行程式時出現 2 則錯誤訊息:Expecting " Expecting ) 每個錯誤左邊的紅色圓圈內都顯示驚嘆號。

Kotlin Playground 的錯誤訊息

錯誤訊息以「Expecting」開頭,因為 Kotlin 編譯器「預期」會識別某個項目,但在程式碼中卻找不到。在這個範例中,編譯器預期在程式的第二行程式碼中,識別到右引號括號和右括號。

請注意,在 println() 陳述式中,要顯示的訊息有左引號,但沒有右引號。即使程式碼有右括號,編譯器也會認為要輸出的文字包括括號,因為括號前面並沒有右引號。

  1. 在驚嘆號與右括號之間新增右引號。
fun main() {
    println("Today is sunny!")
}

主函式包含一行程式碼,也就是 println() 陳述式,其中的文字以引號括住,再用括號括起:"Today is sunny!"

  1. 再次執行程式。

現在應該不會再出現錯了,輸出窗格應會顯示下列文字:

Today is sunny!

錯誤已修正,做得好!您在編寫程式碼及錯誤疑難排解上累積更多經驗之後,就會明白到,在輸入程式碼時注意大小寫、拼字、空格、符號和名稱十分重要。

在下一節,我們會透過一系列練習來驗收您的學習成果。本程式碼研究室的結尾會提供解決方法,但請先盡量自行找出答案。

9. 練習

  1. 您能讀懂這個程式中的程式碼,並猜出輸出結果嗎 (不要在 Kotlin Playground 中執行)?
fun main() {
    println("1")
    println("2")
    println("3")
}

做出猜測後,請複製這段程式碼並貼到 Kotlin Playground 中,看看您是否猜對。

  1. 使用 Kotlin Playground 建立一個輸出下列訊息的程式:
I'm
learning
Kotlin!
  1. 請複製此程式並貼到 Kotlin Playground。
fun main() {
    println("Tuesday")
    println("Thursday")
    println("Wednesday")
    println("Friday")
    println("Monday")
}

請修正程式,使其輸出下列內容:

Monday
Tuesday
Wednesday
Thursday
Friday

我們先完成初級的疑難排解,請修正下列練習中的錯誤:在每個練習中,請將程式碼複製到瀏覽器中的 Kotlin Playground。嘗試執行程式,您就會看到錯誤訊息。

  1. 請修正這個程式中的錯誤,使其產生所需的輸出內容。
fun main() {
    println("Tomorrow is rainy")

所需的輸出內容:

Tomorrow is rainy
  1. 請修正這個程式中的錯誤,使其產生所需的輸出內容。
fun main() {
    printLine("There is a chance of snow")
}

所需的輸出內容:

There is a chance of snow
  1. 請修正這個程式中的錯誤,使其產生所需的輸出內容。
fun main() {
    println("Cloudy") println("Partly Cloudy") println("Windy")
}

所需的輸出內容:

Cloudy
Partly Cloudy
Windy
  1. 請修正這個程式中的錯誤,使其產生所需的輸出內容。
fun main() (
    println("How's the weather today?")
)

所需的輸出內容:

How's the weather today?

完成這些練習後,請按照下一節提供的解決方案來檢查您的答案。

10. 解決方法

  1. 程式的輸出結果如下:
1
2
3
  1. 該程式的程式碼應如下所示:
fun main() {
    println("I'm")
    println("learning")
    println("Kotlin!")
}
  1. 該程式的正確程式碼如下:
fun main() {
    println("Monday")
    println("Tuesday")
    println("Wednesday")
    println("Thursday")
    println("Friday")
}
  1. 程式的第三行缺少右大括號,用於表示 main 函式的函式主體結束。

正確程式碼:

fun main() {
    println("Tomorrow is rainy")
}

輸出內容:

Tomorrow is rainy
  1. 執行該程式時,系統顯示 Unresolved reference: printLine 錯誤。這是因為 printLine() 不是 Kotlin 能識別的函式。您還可以在 Kotlin Playground 中查看程式碼中導致錯誤的部分,這部分會以紅色醒目顯示。請將函式名稱變更為 println,程式便會在輸出內容中顯示一行文字,即可修正錯誤。

正確程式碼:

fun main() {
    println("There is a chance of snow")
}

輸出內容:

There is a chance of snow
  1. 執行該程式時,系統顯示 Unresolved reference: println 錯誤。這則訊息並未直接說明修正問題的方法。在疑難排解錯誤時,有時會出現這種情況,您需要深入瞭解程式碼來解決非預期的行為。

仔細看看,程式碼的第二個 println() 函式呼叫以紅色顯示,指出發生問題的位置。在 Kotlin 中,每行只能有一個陳述式。在這種情況下,您可以將第二和第三個 println() 函式呼叫分別移到新行,即可解決問題。

正確程式碼:

fun main() {
    println("Cloudy")
    println("Partly Cloudy")
    println("Windy")
}

輸出內容:

Cloudy
Partly Cloudy
Windy
  1. 如果您執行該程式,系統會顯示以下錯誤訊息:Function 'main' must have a body。函式主體應使用左右大括號 { } 括住,而不是左右括號 ( )。

正確程式碼:

fun main() {
    println("How's the weather today?")
}

輸出內容:

How's the weather today?

11. 結語

您已完成本 Kotlin 入門課程,太棒了!

您在 Kotlin 建立了簡單的程式,並執行這些程式來查看輸出內容。您以不同方式修改程式,並觀察這些變更對輸出內容的影響。程式設計時出錯是很正常的現象,所以您還開始學習如何疑難排解並修正程式碼上的錯誤;這對您日後的程式設計工作相當重要。

請繼續學習下一個程式碼研究室,瞭解如何使用 Kotlin 中的變數,以建立更有趣的程式!

總結

  • Kotlin 程式需要主函式做為程式的進入點。
  • 如要在 Kotlin 中定義函式,請使用 fun 關鍵字,後面加上函式的名稱,以及任何括號括住的輸入內容,後面接著以大括號括住的函式主體。
  • 函式名稱應符合駝峰式大小寫的規範,且開頭必須是小寫英文字母。
  • 使用 println() 函式呼叫將一些文字輸出至輸出內容。
  • 請參閱 Kotlin 樣式指南,瞭解使用 Kotlin 編寫程式碼時應遵循的格式設定和程式碼慣例。
  • 疑難排解是解決程式碼錯誤的過程。

瞭解詳情