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

從高級程序員的角度來看 rust編程入門實戰與進階( 六 )


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

從高級程序員的角度來看 rust編程入門實戰與進階

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

文章插圖
命名空間
使用全名就無需導入 。導入只不過是別名 。
std::env::args
use std::env;env::args
use std::env::args;args
選擇多個“命名空間”可以使用{},如:
use std::env::{args, var};
也可以重復使用use:
use std::env;use std::env::args;env::var;args
還有一點 , 你也可以在函數內使用use 。這樣,如果代碼沒有被執行 , 庫就不會被導入(即,如果函數沒有在代碼路徑中出現,例如,use了一個測試用的庫,而use只寫在了測試用例中,那么在正常構建時就不會導入該庫) 。
fn test { use std::env; env::var;}
但我不推薦在正常的代碼路徑中這樣寫,應該使用全局的導入 。
從高級程序員的角度來看 rust編程入門實戰與進階

文章插圖
可見性

相關經驗推薦