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!"); }
儲存檔案然後回到你的專案目錄底下 ~/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++ 的背景,你應該就會發現這和 gcc
或 clang
非常相似。編譯成功後,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 的除錯資訊文件。在這裡,你就可以像這樣執行 main 或 main.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 程式。