欧美日韩国产一区二区|qovd片|小明个人发布看看|小浪货你夹真紧水又多|老头把我添高潮了A片故|99热久久精品国产一区二区|久久久春色AV

從高級(jí)程序員的角度來(lái)看 rust編程入門(mén)實(shí)戰(zhàn)與進(jìn)階( 六 )


#[derive(Display,Debug)]struct Something { var: u8}println!("{:?}", Something { var: 1 });
作用域
Trait有作用域,而且與它實(shí)現(xiàn)的類(lèi)型的作用域是獨(dú)立的 。也就是說(shuō),你可以使用一個(gè)類(lèi)型 , 但無(wú)法使用一個(gè)trait的實(shí)現(xiàn)(例如,如果這個(gè)實(shí)現(xiàn)來(lái)自另外一個(gè)庫(kù),而不是來(lái)自該類(lèi)型本身) 。你可以u(píng)se這個(gè)實(shí)現(xiàn) 。
self
trait中的self指向它實(shí)現(xiàn)的類(lèi)型 。&self是指向 self: &Self 的別名,其中Self表示該類(lèi)型(上例中的 self: &Dog) 。self也是self: Self的別名 , 但兩者的區(qū)別就是后者會(huì)移動(dòng)變量(即消耗該變量,該變量就無(wú)法從外部訪問(wèn)了) 。
當(dāng)函數(shù)定義不以self、&self或&mut self開(kāi)始時(shí)(&mut self相當(dāng)于帶有可改變引用的 &self),就是一個(gè)靜態(tài)方法 。Trait依然可以像任何方法一樣定義并實(shí)現(xiàn)靜態(tài)方法 。常見(jiàn)的一個(gè)靜態(tài)方法是new,用于創(chuàng)建類(lèi)型或結(jié)構(gòu)的實(shí)例:
impl Something { fn new -> Something { Something { x: 1 } }}...let var = Something::new;

從高級(jí)程序員的角度來(lái)看 rust編程入門(mén)實(shí)戰(zhàn)與進(jìn)階

文章插圖
指針
指針實(shí)際上非常易懂,盡管它來(lái)自其他更高級(jí)的語(yǔ)言 。我經(jīng)常會(huì)用錯(cuò) 。
&A指向A,使用時(shí)只需要確保A存在 , 即可保證&A存在,因?yàn)槲覀儾粦?yīng)該讓指針指向不存在的對(duì)象 。
Rust會(huì)在編譯時(shí)進(jìn)行靜態(tài)檢查,確保不會(huì)出現(xiàn)上述情況 。它會(huì)自動(dòng)釋放超出作用域的變量,并且不允許指針的存活超過(guò)變量 。另一個(gè)安全保證是 , 只能有一個(gè)可改變的指針 。
也就是說(shuō)下述代碼是錯(cuò)誤的:
let a = 1;let b = &a;let c = &mut a;println!("{b}"); // Error! there can only be one mutable pointerc = 1;
我們只需要保證原始變量在指針的作用域中一直存在即可 。
在結(jié)構(gòu)中使用指針會(huì)有點(diǎn)問(wèn)題,因?yàn)榫幾g器不喜歡這種做法(因?yàn)榻Y(jié)構(gòu)的壽命通常比原始變量更長(zhǎng)) 。我通常會(huì)采用所有權(quán)轉(zhuǎn)移或克?。?clone() , Clone trait的一部分,可以被derived) 。
有時(shí)候,一些函數(shù)要求只能用指針,不能用所有權(quán)轉(zhuǎn)移 。這時(shí),只需在值的前面加上 & (或 &mut)即可 。
something(&a);
此外,還有雙重、三重等指針,但很少見(jiàn),而且一般來(lái)說(shuō)只會(huì)更難處理 。
你也不需要考慮釋放變量的問(wèn)題,Rust會(huì)在超出作用域時(shí)自動(dòng)釋放 。
從高級(jí)程序員的角度來(lái)看 rust編程入門(mén)實(shí)戰(zhàn)與進(jìn)階

文章插圖
命名空間
使用全名就無(wú)需導(dǎo)入 。導(dǎo)入只不過(guò)是別名 。
std::env::args
use std::env;env::args
use std::env::args;args
選擇多個(gè)“命名空間”可以使用{},如:
use std::env::{args, var};
也可以重復(fù)使用use:
use std::env;use std::env::args;env::var;args
還有一點(diǎn) , 你也可以在函數(shù)內(nèi)使用use 。這樣,如果代碼沒(méi)有被執(zhí)行 , 庫(kù)就不會(huì)被導(dǎo)入(即,如果函數(shù)沒(méi)有在代碼路徑中出現(xiàn),例如,use了一個(gè)測(cè)試用的庫(kù),而use只寫(xiě)在了測(cè)試用例中,那么在正常構(gòu)建時(shí)就不會(huì)導(dǎo)入該庫(kù)) 。
fn test { use std::env; env::var;}
但我不推薦在正常的代碼路徑中這樣寫(xiě),應(yīng)該使用全局的導(dǎo)入 。
從高級(jí)程序員的角度來(lái)看 rust編程入門(mén)實(shí)戰(zhàn)與進(jìn)階

文章插圖
可見(jiàn)性

相關(guān)經(jīng)驗(yàn)推薦