Hello, World!

現在你已經安裝好 Rust,是時候開始寫你的第一支 Rust 程式。當我們學習一門新的語言時,有一個習慣是寫一支印出「Hello, world!」到螢幕上的小程式,此章節將教你做一樣的事!

注意:本書將假設你已經知道命令列最基本的使用方法。Rust 對於你的編輯器、工具以及程式碼位於何處沒有特殊的要求,所以如果你更傾向於使用整合開發環境(IDE)的話,請儘管使用你最愛的 IDE。許多 IDE 都已經針對 Rust 提供某種程度的支援,請查看你所使用的 IDE 技術文件以瞭解詳情。Rust 團隊正透過 rust-analyzer 積極提升 IDE 的支援,請查 附錄 D 來了解更多細節。

建立專案目錄

你將先建立一個目錄來儲存你的 Rust 程式碼。程式碼位於何處並不重要,但為了能好好練習書中的範例和專案,我們建議你可以在你的 home 目錄建立一個 projects 目錄然後將你所有的專案保存在此。

請開啟終端機然後輸入以下命令來建立 projects 目錄和另一個在 projects 目錄底下的真正要寫「Hello, world!」專案的目錄。

對於 Linux、macOS 和 Windows 的 PowerShell,請輸入:

$ mkdir ~/projects
$ cd ~/projects
$ mkdir hello_world
$ cd hello_world

對於 Windows CMD,請輸入:

> mkdir "%USERPROFILE%\projects"
> cd /d "%USERPROFILE%\projects"
> mkdir hello_world
> cd hello_world

編寫並執行 Rust 程式

接著,請產生一個全新原始碼檔案並命名為 main.rs。Rust 的文件檔案都會以 .rs 副檔名稱作為結尾。如果你用到不只一個單字的話,慣例上是用底線區隔開來。比方說,請使用 hello_world.rs 而不是 helloworld.rs

現在請開啟 main.rs 檔案然而後輸入範例 1-1 中的程式碼。

檔案名稱:main.rs

fn main() {
    println!("Hello, world!");
}

範例 1-1:印出「Hello, world!」的程式

儲存檔案然後回到你的專案目錄底下 ~/projects/hello_world。在 Linux 或 macOS 上,請輸入以下命令來編譯並執行檔案:

$ rustc main.rs
$ ./main
Hello, world!

在 Windows 上則輸入 .\main.exe 而非 ./main

> rustc main.rs
> .\main.exe
Hello, world!

不管你的作業系統為何,終端機上應該都會出現 Hello, world!。如果你沒有看到,可以回到安裝章節中的「疑難排除」尋求協助。

如果 Hello, world! 有印出來,那麼恭喜你!你正式寫了一支 Rust 程式,所以你也正式成為 Rust 開發者了——歡迎加入!

分析這支 Rust 程式

讓我們來仔細瞧瞧你的「Hello, world!」程式。這是第一塊拼圖:

fn main() {

}

這幾行定義了一個 main 函式。main 是一個特別的函式:它是每個可執行的 Rust 程式永遠第一個執行的程式碼。第一行宣告了一個函式 main,它沒有參數也不回傳任何東西。如果有參數的話,它們會被加進括號 () 內。

函式本體被囊括在大括號 {} 內,Rust 要求所有函式都用大括號包起來。一般來說,良好的程式碼風格會要求將前大括號置於宣告函式的同一行,並用一個空格區隔開來。

如果你想要在不同 Rust 專案之間統一標準風格的話,rustfmt 可以格式化你的程式成特定的風格(更多 rustfmt 資訊請詳見附錄 D)。Rust 團隊已經將此工具納入標準 Rust 發行版中,就像 rustc 一樣,它應該已經安裝到你的電腦上了!

main 函式本體中有以下程式碼:

#![allow(unused)]
fn main() {
    println!("Hello, world!");
}

此行負責了整支程式要做的事:它將文字顯示在螢幕上。這邊有四個細節要注意。

首先,Rust 的排版風格是 4 個空格而非一個 tab。

第二,println! 會呼叫一支 Rust 巨集(macro)。如果是呼叫函式的話,那則會是 println(去掉 !)。我們會在第十九章討論更多巨集的細節。現在你只需要知道使用 ! 代表呼叫一支巨集而非一個正常的函式,且該巨集遵守的規則不全都和函式一樣。

第三,"Hello, world!" 是一個字串,我們將此字串作為引數傳遞給 println!,然後該字串就會被顯示到螢幕上。

第四,我們用分號(;)作為該行結尾,代表此表達式的結束和下一個表達式的開始。多數的 Rust 程式碼都以分號做結尾。

編譯和執行是不同的步驟

你剛剛執行了一個新建立的程式,讓我們來檢查過程中的每一個步驟吧。

在你執行一支 Rust 程式前,你必須用 Rust 編譯器來編譯它,也就是輸入 rustc 命令然後加上你的原始檔案,像這樣子:

$ rustc main.rs

如果你已經有 C 或 C++ 的背景,你應該就會發現這和 gccclang 非常相似。編譯成功後,Rust 編譯器會輸出一個二進制執行檔(binary executable)。

在 Linux、macOS 和 Windows 上的 PowerShell,你可以在你的 shell 輸入 ls 來查看你的執行檔:

$ ls
main  main.rs

在 Linux 和 macOS,你會看到兩個檔案。而在 Windows 上的 PowerShell,你會和使用 CMD 一樣看到三個檔案。在 Windows 上的 CMD,你需要輸入:

> dir /B %= /B 選項代表只顯示檔案名稱 =%
main.exe
main.pdb
main.rs

這顯示了副檔名為 .rs 的原始碼檔案、執行檔(在 Windows 上為 main.exe;其他則為 main),然後在 Windows 上會再出現一個副檔名為 .pdb 的除錯資訊文件。在這裡,你就可以像這樣執行 mainmain.exe 檔案:

$ ./main # 在 Windows 上則是 .\main.exe

如果你的 main.rs 正是你的「Hello, world!」程式,這命令就會顯示 Hello, world! 到你的終端機。

如果你比較熟悉動態語言,像是 Ruby、Python 或 JavaScript,你可能會比較不習慣將編譯與執行程式分為兩個不同的步驟。Rust 是一門預先編譯(ahead-of-time compiled)的語言,代表你可以編譯完成後將執行檔送到其他地方,然後他們就算沒有安裝 Rust 一樣可以執行起來。但如果你給某個人 .rb.py.js 檔案,他們就需要 Ruby、Python 或 Javascript 分別都有安裝好。當然你在這些語言只需要一行命令就可以執行,在語言設計中這一切都只是取捨。

在簡單的程式使用 rustc 來編譯不會有什麼問題,但當你的專案成長時,你將會需要管理所有選擇並讓程式碼易於分享。接下來我們將介紹 Cargo 這項工具給你,它將協助你寫出真正的 Rust 程式。