rust腐竹是什麼意思 Rust生命週期

2021-10-14 07:25:37 字數 2435 閱讀 7416

不同於rust中的泛型引數,程式設計師是可以手動指定的。rust的生命週期是不能手動指定的,需要編譯器根據傳入的引數進行推斷。當編譯器在某條語句上不能根據引數進行推斷時,他會繼續往下執行並推斷生命週期引數。編譯器會持續根據語句上下文推斷出生命週期引數,並選擇最小的那個

struct context<'a> 

fn main() ;

v.vars.push("hello");

println!("", v.vars);

}

同理,當執行下列片段時:

struct context<'a> 

fn main() ;

v.vars.push("hello"); // 'a

println!("", v.vars);

}

編譯器首先會在v.vars.push("hello")推斷出'a'static,然後當執行到裡面的大括號的時候,發現v.vars.push(&s),而s的生命週期為'b,此時編譯器發現兩次推斷不一樣,於是他會選擇生命週期較小的那個'b。而此時v的生命週期大於'b,編譯器會報錯,提示borrowed value does not live long enough。

對於大型程式來說,生命週期推斷往往比較複雜。當編譯器報錯的時候,我們要扮演一次編譯器的角色來弄清楚錯誤究竟是什麼,此時這條原則就很有用。

這一條其實之前談過了,這裡拿出來是用來強調這一點。在我看來,很多生命週期錯誤都是沒有好好理解生命週期表現的意義而出現的。

struct context<'a>

例如對於上面的結構體,我們可以看到,程式設計者的意思是希望namevars是通過同一生命週期作用域引進來的。但是這確定是你想要的嗎?

假設我們現在在編寫乙個自定義語言執行時,context是我們的執行上下文。在不同的context中,vars是上下文的變數名字,而name是我們為不同上下文命名的名字。當我們建立乙個新的上下文時,我們會給每個context建立乙個新的臨時名字。很明顯,vars應該和自定義語言字串擁有同一生命週期,因為vars應該引用那些語言字串,而name則是我們人為加上的自定義字串。如果name是乙個臨時的名字,則我們就會把vars標記為和name一樣的臨時生命週期。此時我們的context將會毫無用處!我們的context將只能在這個短暫的臨時生命週期中執行!

在這種情況下,我們需要把上面的寫成如下所示:

struct context<'a, 'b>

此時,name和vars將有不同的生命週期引數,編譯器會分別推斷出他們的生命週期。於是問題就解決了。

對於impl中的方法來說,self有乙個隱含的生命週期引數。

struct a<'a> 

impl<'a> a<'a>

}fn main() ;

s_ref = a.get();

}println!("", s_ref);

}

對於a的get方法來說,&self有乙個隱含的生命週期引數,這個生命週期就是例項化a所在的區域。如果返回的&str不寫生命週期引數,根據生命週期省略原則,返回的引數將會和&self一樣的生命週期

在上述示例中,返回的&str的生命週期明顯大於self的生命週期。但是在這裡返回的str將會限制在a的例項所在的生命週期內。當a的例項a脫離內部作用區域時,s_ref生命週期就結束了,也不能被引用了。

struct a<'a> 

impl<'a> a<'a>

}fn main() ;

s_ref = a.get();

}println!("", s_ref);

}

正確的是我們顯式宣告我們的返回值的生命週期為'a,於是一切都正常了,此時s_ref的生命週期就擴充到了外部作用域,println就可以正常列印了。

有的時候,我們希望內部的引用變數和self具有相同的生命週期。此時我們需要顯示宣告self的生命週期引數。就像下面一樣。

struct a<'a> 

impl<'a> a<'a>

}}

在&self中間加上'a生命週期引數,能夠顯示宣告self和其他引數的生命週期的關係。

以上就是關於生命週期說明的全部內容,也是學習和練習的提煉和總結。

rust腐竹是什麼意思 Rust

rust 資料型別 rust 語言中的基礎資料型別有以下幾種。整數型 integer 整數型簡稱整型,按照位元位長度和有無符號分為一下種類 位長度有符號 無符號8 bit i8u8 16 bit i16u16 32 bit i32u32 64 bit i64u64 128 bit i128 u128...

丅rust是什麼意思 Rust 中的型別轉換

1.as 運算子 as 運算子有點像 c 中的強制型別轉換,區別在於,它只能用於原始型別 i32 i64 f32 f64 u8 u32 char 等型別 並且它是安全的。例在 rust 中,不同的數值型別是不能進行隱式轉換的,比如 let b i64 1i32 會出現編譯錯誤,提示無法進行型別轉換。...

uma是什麼意思 UMA是什麼意思?

展開全部 uma 不明生物 是636f707962616964757a686964616f31333431376537動畫 進化戰記 betterman 中的一類人造怪物的統稱,是生命工學食料研究所 b.p.l.所長梅崎博士製造出來 協助他利用阿尼瑪斯之花 大量製造蛋白質 具有驚人攻擊性的怪物。阿拉...