Rust 學習筆記 - 在瀏覽器上輸出 Hello world!(一)
歡迎回來!
“Hello world”幾乎是學習任何語言的第一個程式了,學習Rust頁不例外。在開始之前,請你先確保在自己電腦上安裝了Rust。如果你還沒有安裝的話,我們一起安裝一遍,不過,我使用的是Linux作業系統,其他系統可能略有不同,這個你需要注意。Rust 使用 Rustup 安裝,你也可以檢視更詳細的文件:ofollow,noindex">Rustup 。
首先,開啟一個終端,輸入:
$ curl https://sh.rustup.rs -sSf | sh
這行程式碼會幫助我們下載一個小指令碼並執行它,由於網路的原因,你需要耐心等待,多嘗試幾次, 直到出現類似的字樣:
…… Current installation options: default host triple: x86_64-unknown-linux-gnu default toolchain: stable modify PATH variable: yes 1) Proceed with installation (default) 2) Customize installation 3) Cancel installation >
到這裡,離成功就不遠了。接著,跟據提示,輸入“1”並按下回車,就會開始下載一些元件了,你會看到如下字樣:
info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu' info: latest update on 2018-08-02, rust version 1.28.0 (9634041f0 2018-07-30) info: downloading component 'rustc' 20.1 MiB /68.6 MiB ( 29 %) 493.4 KiB/s ETA: 101 s
由於網路原因,你還需要等待一陣子,或者可以考慮其他辦法。直到你看到如下輸出:
Rust is installed now. Great! To get started you need Cargo's bin directory ($HOME/.cargo/bin) in your PATH environment variable. Next time you log in this will be done automatically. https://doc.rust-lang.org/cargo/index.html To configure your current shell run source $HOME/.cargo/env
恭喜你,Rust 已經安裝完成了,包括自帶的 Cargo 包管理器。我們還需要將$HOME/.cargo/bin
新增到環境變數“PATH”中,編輯$HOME/.profile
檔案,在最後面追加export PATH="$HOME/.cargo/bin:$PATH"
就可以了,不過,如果是Ubuntu等系統,Rustup會自動給你新增環境變數。
新增完環境變數後,你需要重啟一下系統,或者登出後重新登入。我們開啟一個終端並輸入:
$ rustc -V rustc 1.28.0 (9634041f0 2018-07-30)
那說明沒有什麼問題。
我們進行第一個程式。用你喜歡的編輯器建立一個檔案:
$ vim hello_world.rs
然後在檔案中輸入:
fn main() { println!("hello world!"); }
編譯並執行:
$ rustc hello_world.rs $ ./hello_world hello world!
也可以使用Cargo:
$ cargo new hello_world --bin Created binary (application) `hello_world` project $ cd hello_world
注意後面的--bin
引數,這將告訴Cargo建立一個可執行程式,而不是庫。
我們可以看到,cargo 自動建立了src
目錄和Cargo.toml
檔案(類似於nodejs的package.js檔案),實際上,cargo還初始化了Git倉庫並建立了.gitignore
檔案。因此在這之前,你應該先安裝並配置好Git。
我們開啟Cargo.toml
檔案:
[package] name = "hello_world" version = "0.1.0" authors = ["xxx <[email protected]>"] [dependencies]
[package]
片段中,包含了專案的名稱、版本和從Git配置中讀取的作者和作者郵箱。[dependencies]
片段中包含了專案的依賴。今後,我們還需要修改Cargo.toml
檔案。你還可以去檢視Cargo
的文件。
我們進入src
目錄中的main.rs
檔案:
cd src vim main.rs
Cargo已經幫我們寫好了“hello world!”, 我們可以直接執行:
$ cargo run // 編譯並執行 Compiling hello_world v0.1.0 (file:///home/xxx/hello_world) Finished dev [unoptimized + debuginfo] target(s) in 0.29s Running `/home/xxx/hello_world/target/debug/hello_world` Hello, world!
或者也可以先編譯,後執行:
$ cargo build // 編譯 Compiling hello_world v0.1.0 (file:///home/xxx/hello_world) Finished dev [unoptimized + debuginfo] target(s) in 0.20s $ ./target/debug/hello_world 執行 Hello, world!
我們會發現,專案目錄下又多出了一個Cargo.lock
檔案和target
目錄,Cargo.lock
檔案由Cargo維護,不需要手動修改,target
目錄用於存放可執行檔案和一些臨時檔案,也不需要我們手動去維護。部分臨時檔案是可以複用的,以提高下次編譯時的編譯速度。
我們執行cargo run
或cargo build
時,預設生成的可執行檔案存放在target/debug
目錄下,雖然編譯速度更快,但執行較緩慢,還包含了一些除錯資訊,導致生成的可執行檔案體積也稍大。我們可以新增--release
引數來開啟編譯器優化,會在target/release
目錄下生成可執行檔案,這時候編譯速度較慢,但是程式的執行速度會更快。
還有一個常用命令是cargo check
,只檢查程式碼是否可以編譯而不生成可執行檔案,因而速度比cargo build
還要快。這裡要說明的是,Rust的編譯器非常強大,大部分情況下,只要能夠編譯通過的程式,執行是沒有什麼問題的。
再來解釋以下這段程式碼:
fn main() { println!("hello world!"); }
第一行,fn
是Rust中的一個關鍵字,用於定義一個函式,main
是Rust的入口函式。要注意,函式體必須包裹在{}
中,不可省略。對換行和縮排也沒有要求;
第二行,println!
呼叫了一個“巨集”而不是函式,注意“!”,呼叫函式不需要“!”,當看到“!”的時候就意味著呼叫的是一個“巨集”而不是普通的函式,在後面會介紹“巨集”。"hello world!"是一個字串,作為引數傳遞給println!
,println!
負責將“hello world!”列印到螢幕上。
我們的目的達到了沒有?然而並沒有,我們需要在瀏覽器上輸出“hello world!”,不僅僅是在終端上。不管你在此之前是否聽說或瞭解過HTTP協議和TCP協議,目前主流瀏覽器通常是先跟HTTP Server建立TCP連線,再通過TCP向HTTP Server傳送HTTP請求。HTTPS又在TCP和HTTP中間加了一層SSL協議,在傳送HTTP請求之前,還需要進行SSL協議“握手”,我們暫且不談HTTPS。
Rust標準庫 中沒有HTTP Server的實現,(Golang的同學請不要笑,Golang的標準庫雜而不精,等後面你就知道Rust是多麼好用了),沒關係,接下來我們實現一個玩具級別的。
請看下一節!