成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Rust 語(yǔ)言技巧和竅門(mén)

開(kāi)發(fā) 后端
Rust是一種全新系統(tǒng)編程語(yǔ)言,Rust語(yǔ)言立足于編譯時(shí)安全,由于沒(méi)有其他語(yǔ)言GC附帶,Rust也是一門(mén)高性能語(yǔ)言,性能堪比C。

Rust是一種全新系統(tǒng)編程語(yǔ)言,Rust語(yǔ)言立足于編譯時(shí)安全,由于沒(méi)有其他語(yǔ)言GC附帶,Rust也是一門(mén)高性能語(yǔ)言,性能堪比C。最近幾年內(nèi),Rust被開(kāi)發(fā)人員廣為采納,是好多年年度最受歡迎語(yǔ)言和開(kāi)發(fā)者最想學(xué)習(xí)的語(yǔ)言。Rust是最有前途可以替代C/C++的語(yǔ)言之一。

[[333734]]

 

當(dāng)然Rust也有缺點(diǎn)就是學(xué)習(xí)曲線比較曲折,對(duì)初學(xué)者不是那么友好。本文蟲(chóng)蟲(chóng)給大家分享一下Rust語(yǔ)言的一些針對(duì)初學(xué)者的編程技巧,希望對(duì)大家有所幫助。

Racer,Clippy,rustfmt和fix

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

Racer用來(lái)幫助你對(duì)rust代碼進(jìn)行補(bǔ)全。

可以使用cargo安裝racer使用:

  1. cargo install racer 

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

  1. rustup component add rust-src 

rustup update可以隨時(shí)獲取最新代碼

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

要安裝Clippy,請(qǐng)運(yùn)行rustup component add clippy

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

  1. cargo clippy --tests -- -W clippy::cargo 

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

 

Rust 語(yǔ)言技巧和竅門(mén)

 

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

安裝rustfmt,使用:

  1. rustup component add rustfmt 

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

  1. cargo fmt。 

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

 

Rust 語(yǔ)言技巧和竅門(mén)

 

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

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

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

  1. fn main() { 
  2.  
  3. println!("Hello,Chongchong"); 
  4.  

println!()就是一個(gè)宏。

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

dbg!宏

 

Rust 語(yǔ)言技巧和竅門(mén)

 

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

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

上面的代碼將打印出:

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

錯(cuò)誤類型轉(zhuǎn)換

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

  1. fn main() { 
  2.  
  3. let path = "/tmp/example"
  4.  
  5. println!("{}", read_file(path)); 
  6.  
  7.  
  8. fn read_file(path: &str) -> String { 
  9.  
  10. std::fs::read_to_string(path).unwrap() 
  11.  

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

  1. 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 
  2.  
  3. note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace 

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

  1. fn main() -> std::result::Result<(),CustomError>{ 
  2.  
  3. let path = "/tmp/example "
  4.  
  5. let v = read_file(path)?; 
  6.  
  7. Ok(()) 
  8.  

模塊化測(cè)試

試想,你項(xiàng)目測(cè)試結(jié)構(gòu)如下:

  1. tests/ 
  2.  
  3. aaa.rs 
  4.  
  5. bbb.rs 

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

  1. tests/ 
  2.  
  3. all
  4.  
  5. mod.rs // mod aaa; mod bbb; 
  6.  
  7. aaa.rs 
  8.  
  9. bbb.rs 
  10.  
  11. mod.rs // mod all

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

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

編譯器緩存

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

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

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

cargo install sccache。

windows下可以使用

  1. scoop install sccache 

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

  1. [build] 
  2.  
  3. rustc-wrapper = "/path/to/sccache" 

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

  1. RUSTC_WRAPPER=/path/to/sccache cargo build 

避免不必要的克隆

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

  1. fn main() { 
  2.  
  3. let x = Foo::new(); 
  4.  
  5. func(x.clone()); 
  6.  
  7. func(x.clone()); // 該克隆是非必須的 
  8.  
  9. fn main() { 
  10.  
  11. let x = Foo::new(); 
  12.  
  13. func(x.clone()); 
  14.  
  15. func(x); // This will work fine because you do not need 
  16.  
  17. // to use x after this call 
  18.  

使用:

  1. fn main() { 
  2.  
  3. let x = Foo::new(); 
  4.  
  5. func(&x); 
  6.  
  7. func(&x); 
  8.  

枚舉大小受最大成員限制

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

  1. enum Foo{ 
  2.  
  3. A(u64), 
  4.  
  5. B([u64; 1000]), 
  6.  
  7.  
  8. enum FooBoxing { 
  9.  
  10. A(u64), 
  11.  
  12. B(Box<[u64;1000]>) 
  13.  
  14.  
  15. fn main() { 
  16.  
  17. let x = Foo::A(0); // 大小8008 字節(jié) 
  18.  
  19. let y = FooBoxing::A(0); // 16字節(jié) 
  20.  
  21. println!("Foo size {:?}", std::mem::size_of_val(&x)); 
  22.  
  23. println!("FooBoxing size {:?}", std::mem::size_of_val(&y)); 
  24.  

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

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

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

  1. use std::mem; 
  2.  
  3. let mut x = 5; 
  4.  
  5. let mut y = 42; 
  6.  
  7. mem::swap(&mut x, &mut y); 
  8.  
  9. assert_eq!(42, x); 
  10.  
  11. assert_eq!(5, y); 

結(jié)論

 

Rust語(yǔ)言中有很多使用的技巧可以參考。希望本文拋磚引玉,給大家一些啟發(fā)。大家如果更好的技巧和實(shí)用方法請(qǐng)回復(fù)本文。

 

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2018-04-19 14:30:25

LinuxVi編輯器

2013-12-31 09:26:31

JavaScript技巧

2024-07-24 11:40:33

2020-06-23 07:48:18

Python開(kāi)發(fā)技術(shù)

2020-10-22 06:59:09

GolangRust語(yǔ)言

2022-06-22 10:04:29

JavaScriptRust語(yǔ)言

2020-02-03 10:10:05

Windows 10技巧Windows

2023-03-22 14:07:00

機(jī)器人

2023-10-18 10:21:23

JavaScript前端

2019-10-25 08:50:36

Windows 10技巧竅門(mén)

2023-09-05 08:44:14

文本編輯器VS Code技巧

2015-11-25 10:43:03

DGORust

2020-07-07 07:00:00

RustGo語(yǔ)言編程語(yǔ)言

2021-03-23 14:50:16

編程語(yǔ)言Rust漏洞

2024-04-11 13:13:27

2021-08-14 10:27:01

IP地址漏洞Rust語(yǔ)言

2022-03-02 09:49:14

Rust編程語(yǔ)言

2016-12-07 09:56:32

預(yù)測(cè)模型技巧

2016-12-06 19:29:56

機(jī)器學(xué)習(xí)性能數(shù)據(jù)

2022-05-09 10:36:05

PythonPyScript開(kāi)發(fā)者
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产在线观看一区二区 | 精品国产一区二区三区久久狼黑人 | 日韩精品一区二区三区第95 | 99r在线 | 国产精品一区二区三区在线 | 欧美最猛黑人xxxⅹ 粉嫩一区二区三区四区公司1 | 久久精品一区二 | 国产激情精品 | 91青青草视频 | 国产精品夜间视频香蕉 | 欧美高清性xxxxhdvideosex | 日韩色视频 | 久久99视频精品 | 成人精品国产一区二区4080 | 日韩av在线中文字幕 | 国产免费一区二区 | 日韩一二三区视频 | 成人免费看黄网站在线观看 | 久久久久国产一区二区三区 | 中文字幕亚洲免费 | 精品久久久网站 | 91精品国产91久久久久久 | 一区二区三区四区在线视频 | 在线精品亚洲欧美日韩国产 | 欧美一级特黄aaa大片在线观看 | 国产精品一区二区无线 | 国产成人免费 | av超碰| 欧美一区二区三区在线观看视频 | 精品影院| 久久国产精品一区 | 久久99精品久久久久久秒播九色 | 亚洲视频在线一区 | 国产日韩一区二区三区 | 97免费视频在线观看 | 国产黄色av网站 | 亚洲成人一区 | 成人h视频 | 一区二区三区电影网 | 久久久91精品国产一区二区三区 | 免费久久久 |