包管理器Cargo的基本使用
Rust官方提供了包管理器Cargo,且Cargo同時負責項目的初始化、構建等功能。建議的做法是使用Cargo初始化項目,然後進行編寫,之後使用Cargo進行構建。故而,這裏簡單介紹如何用Cargo完成這兩項功能。
創建項目
$ cargo new YOUR_DIR --bin
該命令會在當前目錄下生成 YOUR_DIR
這個新目錄,其中包含新項目的“模板”文件(即示例)。之後的命令基本均在該目錄下進行。
注意這裏的 --bin
要求Cargo創建一個二進制/可執行項目; --lib
或留空均會創建庫項目。
在 YOUR_DIR
目錄下有一個名爲 Cargo.toml
的文件。該文件是項目的(Cargo)配置文件,用來描述項目的依賴關係、控制編譯/構建過程等。
編譯並執行項目
$ cargo run
Rust基本語法
Rust是一門強類型、手動類型的語言,這意味着函數參數需要顯式地聲明參數類型(以及返回值類型)。但Rust支持類型自動推導,在聲明並初始化變量時可以通過類型自動推導而省略變量類型。整體而言,Rust的語法承襲自C家族。
Hello world
類似於C,Rust程序開始於 main
函數:
fn main() { println!("Hello, world!"); }
在Rust中,main
函數是一個沒有參數沒有返回值的函數。可以看到:
fn
聲明一個函數- 大括號/花括號
{}
用來標記代碼塊 - 分號
;
作爲語句結束符
注意到這裏輸出所用的 println!()
是一個 宏 ——其中的感歎號 !
正是宏的標識(定義宏時編譯器自動添加)。Rust的 宏 更貼近Lisp系的宏,不在本文中介紹。
函數、參數及類型聲明
fn my_awesome_function(x: i32) -> i32 { x + 1 }
- Rust的數據類型在變量名稱之後,使用冒號分隔
- 函數返回值使用
->
標記 - 函數最後一行 表達式 作爲函數的返回值
- 但也可使用return,寫成 語句
注意 表達式 和 語句 的區別,語句不返回值。
變量聲明及代碼塊
(部分代碼段抄自 The Rust Programming Language (Second Edition) )
fn main() { let a: float32; a = 30.4; let x = 5; let y = { let x = 3; x + 1 }; println!("a={} x={} y={}", a, x, y); }
- 使用
let
進行變量的聲明 - 如之前所說,變量的類型在變量名之後
- 當編譯器可以進行自動推導時,變量的類型可以省略
- 使用
- Rust使用
{}
劃分代碼塊,每個代碼塊劃分一個作用域 - 內部代碼塊/作用域可以通過再次聲明變量,以臨時覆蓋外部變量的值
- 每個代碼塊被視爲一個 表達式 ,(同函數一樣)使用其內部的最後一個表達式作爲其值
可變性
fn main() { let x = 5; x = 1; // 本行會報錯,刪除本行解決問題 let mut y = 2; y = 8; println!("x={} y={}", x, y); }
- Rust的變量默認爲 不可變 (類似於const/final),函數參數也是如此
- 如要使其可變,需要在其名稱前面加上
mut
雜項(可不看)
fn multi() -> (i32, i32, f32) { let x: i32; let y = 3; let z; x = 20; z = 50.0; (x, y, z) } fn main() { let (a, b, c) = multi(); println!("a={0} b={1} c={2}", a, b, c); }
- 函數的聲明/定義順序不重要
- 並且Rust似乎並沒有專門的“聲明”語法
- 函數可以進行多值返回,多個返回值使用
()
括起來 - 可以使用“解包”操作將多個值直接賦值給相同數量的變量
- 這裏實際上是返回了一個 元組 (見 數據類型 部分)
- 已聲明的變量可以被重新聲明,以覆蓋原有的變量(常用於轉換類型)
Backward links:
您可以在Hypothesis上的該群組內進行評論,或使用下面的Disqus評論。