溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Rust語言技巧的使用方法是什么

發(fā)布時間:2021-11-01 09:53:44 來源:億速云 閱讀:231 作者:iii 欄目:編程語言

這篇文章主要介紹“Rust語言技巧的使用方法是什么”,在日常操作中,相信很多人在Rust語言技巧的使用方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Rust語言技巧的使用方法是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

Racer,Clippy,rustfmt和fix

這是非常好用的一組工具。

Racer用來幫助你對rust代碼進行補全。

可以使用cargo安裝racer使用:

cargo install racer

racer需要先獲取Rust源碼路徑,可以通過rustup獲取源碼:

rustup component add rust-src

rustup update可以隨時獲取最新代碼

Clippy可以在代碼中捕獲各種lints,并檢查代碼是否符合rust慣用寫法,地道不地道、高效不高效?。

要安裝Clippy,請運行rustup component add clippy

然后在工作區(qū)中運行Clippy:

cargo clippy --tests -- -W clippy::cargo

可以通過執(zhí)行命令行參數(shù)或者clippy.toml配置文檔來制定clippy的檢查事項:

Rust語言技巧的使用方法是什么

rustfmt是一種根據(jù)風(fēng)格樣式來格式化Rust代碼的工具。

安裝rustfmt,使用:

rustup component add rustfmt

然后工作區(qū)中運行rustfmt:

cargo fmt。

同樣的可以用rustfmt.toml來配置rustfmt的風(fēng)格:

Rust語言技巧的使用方法是什么

cargo fix工具可以自動修復(fù)編譯器中警告項。

同名宏,函數(shù)和類型

熟悉Rust的同學(xué)可能知道,Rust最強大的功能之一就是宏,比如Hello,Chongchong范例中:

fn main() {  println!("Hello,Chongchong");  }

println!()就是一個宏。

在Rust我們可以使用相同的名稱聲明一個宏,一個函數(shù)和一個類型,然后可以用一條import語句將他們引入其他文件。

dbg!宏

Rust語言技巧的使用方法是什么

DBG宏可用于顯示表達式和值的計算過程,可以用來快捷調(diào)試部分代碼表達式。比如:

let a = 2;  et b = dbg!((a+3) * 2) + 1;  assert_eq!(b, 11);

上面的代碼將打印出:

[dbg.rs:3] (a + 3) * 2 = 10

錯誤類型轉(zhuǎn)換

直接使用rust的錯誤處理可能不夠靈活,使用unwrap(),當(dāng)出現(xiàn)錯誤時候就會觸發(fā)panic,導(dǎo)致程序掛掉,很多時候這不是我們所期望的。下面是一個例子,

fn main() {  let path = "/tmp/example";  println!("{}", read_file(path));  }  fn read_file(path: &str) -> String {  std::fs::read_to_string(path).unwrap()  }

如果/tmp/example,不存在就會觸發(fā)panic錯誤:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Os { code: 2, kind: NotFound, message: "No such file or directory" }', ok.rs:7:5  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

好在我們可以使用?,通過?運算符可以將錯誤返回轉(zhuǎn)化為了Err(From::from(err))和Ok(ok)分支處理,這樣錯誤可以轉(zhuǎn)換為自動類型。部分代碼如下,可以自定義錯誤消息CustomError:

fn main() -> std::result::Result<(),CustomError>{  let path = "/tmp/example ";  let v = read_file(path)?;  Ok(())  }

模塊化測試

試想,你項目測試結(jié)構(gòu)如下:

tests/  aaa.rs  bbb.rs

測試時,這些每個都會被編譯為單獨的二進制文件,這會花費大量編譯時間和空間。可以將這些測試文件作為模塊添加到一個測試中,這樣就只生成一個二進制文件。新測試結(jié)構(gòu)如下所示:

tests/  all/  mod.rs // mod aaa; mod bbb;  aaa.rs  bbb.rs  mod.rs // mod all;

使用該技巧,能夠大大減少編譯時間,節(jié)省時間和空間提高效率。

當(dāng)然它也有缺點那就是不能對單個文件進行測試,而只能統(tǒng)一編譯該文件。即使只更改了一個測試文件,它也要編譯完整項目文件。

編譯器緩存

Rust編譯器cargo只支持工作區(qū)內(nèi)部項目間的編譯緩存,不支持工作區(qū)之間的緩存。對于多個工作區(qū)的多個項目使用相同的依賴關(guān)系,就要額外花費時間各自編譯。我們可以借助cargo緩存工具sccahe來解決這個問題。

sccache是類似于ccache的cargo的編譯器緩存,編譯該依賴關(guān)系一次,然后在所有項目中就可以重復(fù)使用。可以大大節(jié)省編譯時間和磁盤空間。sccache除了可以把編譯構(gòu)建存在本地外,也支持存在云端,比如AWS  S3或者GCS等。

可以使用操作系統(tǒng)包管理器或者cargo來安裝sccache:

cargo install sccache。

windows下可以使用

scoop install sccache

要使用sccache緩存rust編譯,需要在cargo配置文件(~/.cargo/config)中定義build.rustc-wrapper:

[build]  rustc-wrapper = "/path/to/sccache"

也可以在編譯時候直接設(shè)置RUSTC_WRAPPER環(huán)境變量:

RUSTC_WRAPPER=/path/to/sccache cargo build

避免不必要的克隆

在rust中對變量調(diào)用.clone()會為其創(chuàng)建數(shù)據(jù)的副本。創(chuàng)建數(shù)據(jù)副本需要消耗很多內(nèi)存資源,因此大多數(shù)情況下會影響程序的性能,應(yīng)避免使用。通常,可以將使用應(yīng)用引用而非創(chuàng)建clone。例如:

fn main() {  let x = Foo::new();  func(x.clone());  func(x.clone()); // 該克隆是非必須的  fn main() {  let x = Foo::new();  func(x.clone());  func(x); // This will work fine because you do not need  // to use x after this call  }

使用:

fn main() {  let x = Foo::new();  func(&x);  func(&x);  }

枚舉大小受最大成員限制

枚舉的大小使其能夠容納其最大的變體。因此,建議在枚舉內(nèi)使用類似大小的變體,以避免內(nèi)存布局不理想。如果需要,可以考慮將較大的變量Box化。考慮以下示例:

enum Foo{  A(u64),  B([u64; 1000]),  }  enum FooBoxing {  A(u64),  B(Box<[u64;1000]>)  }  fn main() {  let x = Foo::A(0); // 大小8008 字節(jié)  let y = FooBoxing::A(0); // 16字節(jié)  println!("Foo size {:?}", std::mem::size_of_val(&x));  println!("FooBoxing size {:?}", std::mem::size_of_val(&y));  }

在上面的示例中,枚舉Foo的變體A的大小比變體B小得多,但用于兩個變體的內(nèi)存布局將相同,因此,當(dāng)使用變體A時,其性能將不理想。

標(biāo)準(zhǔn)交換功能

rust swap函數(shù)允許直接交換兩個變量,而無需創(chuàng)建一個臨時變量。

use std::mem;  let mut x = 5;  let mut y = 42;  mem::swap(&mut x, &mut y);  assert_eq!(42, x);  assert_eq!(5, y);

到此,關(guān)于“Rust語言技巧的使用方法是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI