# Hello, world!
現在你已經安裝好了Rust,讓我們開始寫第一個Rust程序吧。作為一個傳統,你任何新語言的第一個程序應該在屏幕上打印出“Hello, world!”。寫這么一個小程序有一個好處就是你可以確認你安裝的Rust編譯器不僅僅是裝上了而已。并且在屏幕上打印信息是一件非常常見的事情。
你需要做的第一件事就是創建一個用來寫代碼的文件。我喜歡在home目錄下創建一個projects文件夾,用來存放我的所有項目。Rust并不關心你的代碼位于何處。
這里確實有另一個導致我擔心的地方:這個教程假定你熟悉基本的命令行操作。Rust并不要求你非常了解命令行,但是直到這個語言到達一個更加完善的地步,IDE支持將是十分差勁的。Rust并不對你使用的編輯工具和代碼位置有特定的要求。
既然這么說了,讓我們在projects目錄下新建一個目錄
~~~
$ mkdir ~/projects
$ cd ~/projects
$ mkdir hello_world
$ cd hello_world
~~~
如果你使用Windows并且沒有用PowerShell,`~`可能無效。查詢你所使用的Shell的文檔以獲取更多信息。
接下來讓我們新建一個源文件。在本例中我使用`editor filename`這種語法來代表編輯一個文件,不過你應該使用自己的編輯器。我們叫源文件`main.rs`:
~~~
$ editor main.rs
~~~
Rust源文件總是使用`.rs`后綴。如果你使用了多個詞,使用下劃線分隔。寫成`hello_world.rs`而不是`helloworld.rs`。
現在打開你的源文件,鍵入如下代碼:
~~~
fn main() {
println!("Hello, world!");
}
~~~
保存文件,然后在終端中輸入如下命令:
~~~
$ rustc main.rs
$ ./main # or main.exe on Windows
Hello, world!
~~~
你也可以在[play.rust-lang.org](https://play.rust-lang.org/)中運行這個例子。你可以將鼠標放到代碼上方,然后點擊出現在右上角的箭頭運行代碼(明顯這里文檔已經過時,上面那個網址已經改版,點擊evaluate按鈕運行腳本,同時還可以查看匯編和LLVM IR等)。
搞定這些,讓我們回過頭來看看到底發生了什么
~~~
fn main() {
}
~~~
這幾行定義了一個Rust函數。`main`函數是特殊的:這是所有Rust程序的開始。第一行表示“我定義了一個叫main的函數,沒有參數也沒有返回值。”如果有參數的話,它們應該出現在括號(`(`和`)`)中。因為我們并沒有返回任何東西,我們可以完全省略返回類型。我們稍后將談論這些。
你會注意到函數被大括號(`{`和`}`)包圍起來。Rust要求大括號中包含所有函數體。將左大括號與函數定義置于一排并留有一個空格被認為是一個好的代碼格式。
接下來是這一行:
~~~
println!("Hello, world!");
~~~
這一行做了我們這小程序的所有工作。這里有一些細節比較重要。第一,縮進是4個空格,而不是制表符(Tab)。請設置你的編輯器Tab鍵為插入4個空格。我們提供[多種編輯器的配置例子](https://github.com/rust-lang/rust/blob/master/src/etc/CONFIGS.md)。
第二點是`println!()`部分。這是一個Rust宏,是Rust元編程的關鍵所在。如果你使用函數的話應該寫成`println()`。在這里,我們并不用擔心這兩者的區別。只需記住,有時你會看到一個`!`,那代表你調用了一個宏而不是一個普通的函數。有很多理由使得Rust實現了`println!`宏而不只是一個函數,不過這涉及一些非常高端的話題。你會在我們談論宏的時候了解更多。最后提醒一點:Rust宏與C語言的宏有顯著區別,萬一你用過C語言宏的話。使用宏時請不要恐懼。我們最終會仔細研究它,現在你只需相信我們。
下一部分,`"Hello, world!"`是一個字符串。在一門系統編程語言中,字符串是一個復雜得令人驚訝的話題。這是一個靜態分配的字符串。我們將在后面討論更多不同的分配方式。我們把這個字符串作為參數傳遞給`println!`,而它負責在屏幕上打印字符串。就這么簡單!
最后,這一行以一個分號結尾(;)。Rust是一門_面向表達式_(expression oriented)的語言,也就是說大部分語句都是表達式。分號用來表示一個表達式的結束,另一個新表達式的開始。大部分Rust代碼行以分號結尾。我們將在后面更深層次地討論這個問題。
最后,讓我們實際編譯和運行我們的程序。我們可以使用編譯器`rustc`,用我們的源文件名作為參數:
~~~
$ rustc main.rs
~~~
這跟`gcc`或`clang`類似,如果你有C或C++知識背景。Rust會輸出一個可執行文件。你可以用`ls`查看它:
~~~
$ ls
main main.rs
~~~
或者在Windows下:
~~~
$ dir
main.exe main.rs
~~~
現在這里有兩個文件:我們`.rs`后綴的源文件,和可執行文件(在Windows下為`main.exe`,其它平臺是`main`)。
~~~
$ ./main # or main.exe on Windows
~~~
這將在終端上打印出`Hello, world!`。
對于來自像Ruby,Python或者Javascript這樣的動態類型語言的同學,可能不太習慣這樣將編譯和執行分開的行為。Rust是一門_預先編譯語言_(_ahead-of-time compiled language_),這意味著你可以編譯一個程序,把它給任何人,他們都不需要安裝Rust就可運行。如果你給他們一個`.rb`,`.py`或`.js`文件,他們需要先安裝Ruby/Python/Javascript,不過你只需要一句命令就可以編譯和執行你的程序。這一切都是語言設計的權衡取舍,而Rust已經做出了它的選擇。
祝賀你!你已經正式完成了一個Rust程序。你現在是一名Rust程序猿了!歡迎入坑←_←
接下來,我將向你介紹另外一個工具,Cargo,它用來編寫真實世界的Rust程序。僅僅使用`rustc`可以很好應對簡單的程序,但是當你的項目不斷增長,你將會一個工具幫助你管理所有可能的選項,幫助你更加輕松的與別人和別的項目分享代碼。
- 前言
- 1.介紹
- 2.準備
- 2.1.安裝Rust
- 2.2.Hello, world!
- 2.3.Hello, Cargo!
- 3.學習Rust
- 3.1.猜猜看
- 3.2.哲學家就餐問題
- 3.3.其它語言中的Rust
- 4.高效Rust
- 4.1.棧和堆
- 4.2.測試
- 4.3.條件編譯
- 4.4.文檔
- 4.5.迭代器
- 4.6.并發
- 4.7.錯誤處理
- 4.8.外部語言接口
- 4.9.Borrow 和 AsRef
- 4.10.發布途徑
- 5.語法和語義
- 5.1.變量綁定
- 5.2.函數
- 5.3.原生類型
- 5.4.注釋
- 5.5.If語句
- 5.6.for循環
- 5.7.while循環
- 5.8.所有權
- 5.9.引用和借用
- 5.10.生命周期
- 5.11.可變性
- 5.12.結構體
- 5.13.枚舉
- 5.14.匹配
- 5.15.模式
- 5.16.方法語法
- 5.17.Vectors
- 5.18.字符串
- 5.19.泛型
- 5.20.Traits
- 5.21.Drop
- 5.22.if let
- 5.23.trait對象
- 5.24.閉包
- 5.25.通用函數調用語法
- 5.26.包裝箱和模塊
- 5.27.`const`和`static`
- 5.28.屬性
- 5.29.`type`別名
- 5.30.類型轉換
- 5.31.關聯類型
- 5.32.不定長類型
- 5.33.運算符和重載
- 5.34.`Deref`強制多態
- 5.35.宏
- 5.36.裸指針
- 6.Rust開發版
- 6.1.編譯器插件
- 6.2.內聯匯編
- 6.3.不使用標準庫
- 6.4.固有功能
- 6.5.語言項
- 6.6.鏈接參數
- 6.7.基準測試
- 6.8.裝箱語法和模式
- 6.9.切片模式
- 6.10.關聯常量
- 7.詞匯表
- 8.學院派研究
- 勘誤