2022 Rust 入門指南
Rust 是一門相對較新的編程語言,受到各個企業的 程序員的歡迎。儘管如此,它仍是一門建立在之前所有事物之上的語言。畢竟,Rust 不是一天做出來的,所以即便 Rust 中的一些概念看起來與你從 Python、Java、C++ 等編程語言學到的東西大不相同,但它們都是基於同一個基礎,那就是你一直與之交互(無論你是否知道)的 CPU 和 NUMA( 非統一內存訪問 )架構,因此 Rust 中的一些新功能讓人感覺有些熟悉。
現在,我的職業不是程序員。我沒耐心但我又有點兒強迫症。當我需要完成某件事時,如果一門語言不能幫助我相對較快地獲得想要的結果,那麼我很少會受到鼓舞而使用它。Rust 試圖平衡兩個矛盾:現代計算機對安全和結構化代碼的需求,和現代程序員對編碼工作事半功倍的渴望。
安裝 Rust
rust-lang.org 網站有豐富的的文檔指導如何安裝 Rust,但通常,它就像下載 sh.rustup.rs
腳本並運行它一樣簡單。
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs
$ less sh.rustup.sh
$ sh ./sh.rustup.rs
沒有類
Rust 沒有類,也不使用 class
關鍵字。Rust 確實有 struct
數據類型,但它的作用是充當數據集合的一種模板。因此,你可以使用 結構體 ,而不是創建一個類來表示虛擬對象:
struct Penguin {
genus: String,
species: String,
extinct: bool,
classified: u64,
}
你可以像使用類一樣使用它。例如,當定義完 Penguin
結構,你就可以創建它的實例,並與該實例進行交互:
struct Penguin {
genus: String,
species: String,
extinct: bool,
classified: u64,
}
fn main() {
let p = Penguin { genus: "Pygoscelis".to_owned(),
species: "R adeliæ".to_owned(),
extinct: false,
classified: 1841 };
println!("Species: {}", p.species);
println!("Genus: {}", p.genus);
println!("Classified in {}", p.classified);
if p.extinct == true {
println!("Sadly this penguin has been made extinct.");
}
}
將 impl
數據類型與 struct
數據類型結合使用,你可以實現一個包含函數的結構體,並且可以添加繼承和其他與類相似的特性。
函數
Rust 中的函數很像其他語言中的函數。每個函數都代表一組嚴謹的任務,你可以在需要時調用它們。主函數名必須是 main
。
用 fn
關鍵字聲明函數,後跟函數名稱和函數接受的所有參數。
fn foo() {
let n = 8;
println!("Eight is written as {}", n);
}
通過參數,將信息從一個函數傳遞到另一個函數。例如,我已經創建了一個 Penguin
類(結構),並且我有一個 Penguin
的實例為 p
,將目標函數的參數指定為 Penguin
類型,就可把 p
的屬性從一個函數傳遞到另一個函數。
fn main() {
let p = Penguin { genus: "Pygoscelis".to_owned(),
species: "R adeliæ".to_owned(),
extinct: false, classified: 1841 };
printer(p);
}
fn printer(p: Penguin) {
println!("Species: {}", p.species);
println!("Genus: {}", p.genus);
println!("Classified in {}", p.classified);
if p.extinct == true {
println!("Sadly this penguin has been made extinct.");
}
}
變數
Rust 默認創建的為 不可變 變數。這意味著你創建的變數以後無法更改。這段代碼雖然看起來沒問題,但無法編譯:
fn main() {
let n = 6;
let n = 5;
}
但你可以使用關鍵字 mut
聲明一個 可變 變數,因此下面這段代碼可以編譯成功:
fn main() {
let mut n = 6;
println!("Value is {}", n);
n = 5;
println!("Value is {}", n);
}
編譯
Rust 編譯器,至少就其報錯信息而言,是可用的最好的編譯器之一。當你在 Rust 中出錯時,編譯器會真誠地告訴你做錯了什麼。實際上,僅通過從編譯器錯誤消息中學習,我就了解了 Rust 的許多細微差別(就我理解到的 Rust 的任何細微差別而言)。即便有時錯誤消息太過於模糊,而不知所以然,互聯網搜索幾乎總能得到解釋。
啟動 Rust 程序的最簡單方法是使用 cargo
,它是 Rust 的包管理和構建系統。
$ mkdir myproject
$ cd myproject
$ cargo init
以上命令為項目創建了基本的基礎架構,最值得注意的是 src
子目錄中的 main.rs
文件。打開此文件,把我為本文生成的示例代碼粘貼進去:
struct Penguin {
genus: String,
species: String,
extinct: bool,
classified: u64,
}
fn main() {
let p = Penguin { genus: "Pygoscelis".to_owned(), species: "R adeliæ".to_owned(), extinct: false, classified: 1841 };
printer(p);
foo();
}
fn printer(p: Penguin) {
println!("Species: {}", p.species);
println!("Genus: {}", p.genus);
println!("Classified in {}", p.classified);
if p.extinct == true {
println!("Sadly this penguin has been made extinct.");
}
}
fn foo() {
let mut n = 6;
println!("Value is {}", n);
n = 8;
println!("Eight is written as {}", n);
}
使用 cargo build
命令進行編譯:
$ cargo build
執行 target
子目錄下的二進位程序,或者直接運行 cargo run
命令來運行你的項目:
$ cargo run
Species: R adeliæ
Genus: Pygoscelis
Classified in 1841
Value is 6
Eight is written as 8
Crates
任何語言的大部分便利都來自於它的庫或模塊。在 Rust 中,進行分發和跟蹤的庫稱為 「crate」(箱子)。crates.io 是一個很好的社區 crate 註冊網站。
把一個 crate 添加到你的 Rust 項目,首先要在 Cargo.toml
文件中添加這個 crate。例如,要安裝隨機數函數,我使用名為 rand
的 crate,使用 *
作為通配符,以確保在編譯時獲得最新版本:
[package]
name = "myproject"
version = "0.1.0"
authors = ["Seth <seth@opensource.com>"]
edition = "2022"
[dependencies]
rand = "*"
在 Rust 代碼中使用它需要在最頂行使用 use
語句:
use rand::Rng;
以下是一些創建隨機種子和隨機範圍的示例代碼:
fn foo() {
let mut rng = rand::thread_rng();
let mut n = rng.gen_range(1..99);
println!("Value is {}", n);
n = rng.gen_range(1..99);
println!("Value is {}", n);
}
你可以使用 cargo run
來運行它,它會檢測代碼是否被更改並觸發一個新的構建。構建過程中下載名為 rand
的 crete
和它依賴的所有 crate
,編譯代碼,然後運行它:
$ cargo run
Updating crates.io index
Downloaded ppv-lite86 v0.2.16
Downloaded 1 crate (22.2 KB) in 1.40s
Compiling libc v0.2.112
Compiling cfg-if v1.0.0
Compiling ppv-lite86 v0.2.16
Compiling getrandom v0.2.3
Compiling rand_core v0.6.3
Compiling rand_chacha v0.3.1
Compiling rand v0.8.4
Compiling rustpenguin v0.1.0 (/home/sek/Demo/rustpenguin)
Finished dev [unoptimized + debuginfo] target(s) in 13.97s
Running `target/debug/rustpenguin`
Species: R adeliæ
Genus: Pygoscelis
Classified in 1841
Value is 70
Value is 35
Rust 速查表
Rust 是一門令人非常愉快的語言。集成了在線註冊網站、有用的編譯器和幾乎直觀的語法,它給人的適當的現代感。
但請不要誤會,Rust 仍是一門複雜的語言,它具有嚴格的數據類型、強作用域變數和許多內置方法。Rust 值得一看,如果你要探索它,那麼你應該下載我們的免費 Rust 速查表,以便快速了解基礎知識。越早開始,就越早了解 Rust。當然,你應該經常練習以避免生疏。
via: https://opensource.com/article/22/1/rust-cheat-sheet
作者:Seth Kenlon 選題:lujun9972 譯者:hanszhao80 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive