rust 生命週期2

2022-03-12 03:39:19 字數 1908 閱讀 3388

之前定義的結構體,都是不含引用的。 如果想定義含引用的結構體,請定義生命週期註解

#[warn(unused_variables)]

struct importantexcerpt<'a>

fn main() ;

}

這個結構體有乙個字段,part,它存放了乙個字串 slice,這是乙個引用。類似於泛型引數型別,必須在結構體名稱後面的尖括號中宣告泛型生命週期引數,以便在結構體定義中使用生命週期引數。這個註解意味著importantexcerpt的例項不能比其part欄位中的引用存在的更久。

這裡的main函式建立了乙個importantexcerpt的例項,它存放了變數novel所擁有的string的第乙個句子的引用。novel的資料在importantexcerpt例項建立之前就存在。另外,直到importantexcerpt離開作用域之後novel都不會離開作用域,所以importantexcerpt例項中的引用是有效的

現在我們已經知道了每乙個引用都有乙個生命週期,而且我們需要為那些使用了引用的函式或結構體指定生命週期。

有一種情況,它沒有生命週期註解卻能編譯成功:

fn first_word(s: &str) -> &str 

}&s[..]

}

定義了乙個沒有使用生命週期註解的函式,即便其引數和返回值都是引用

這個函式沒有生命週期註解卻能編譯是由於一些歷史原因:在早期版本(pre-1.0)的 rust 中,這的確是不能編譯的。

每乙個引用都必須有明確的生命週期。那時的函式簽名將會寫成這樣:

fn first_word<'a>(s: &'a str) -> &'a str 

}

impl之後和型別名稱之後的生命週期引數是必要的,不過因為第一條生命週期規則我們並不必須標註self引用的生命週期。

這裡是乙個適用於第三條生命週期省略規則的例子:

impl<'a> importantexcerpt<'a> ", announcement);

self.part

}}

這裡有兩個輸入生命週期,所以 rust 應用第一條生命週期省略規則並給予&selfannouncement他們各自的生命週期。接著,因為其中乙個引數是&self,返回值型別被賦予了&self的生命週期,這樣所有的生命週期都被計算出來了。

相當於:

fn announce_and_return_part<'a,'b>(&'a self, announcement: &'b str) -> &'a str ", ann);

if x.len() > y.len() else

}

這個是longest示例中那個返回兩個字串 slice 中較長者的longest函式,不過帶有乙個額外的引數annann的型別是泛型t,它可以被放入任何實現了where從句中指定的displaytrait 的型別。這個額外的引數會在函式比較字串 slice 的長度之前被列印出來,這也就是為什麼display特質約束是必須的。因為生命週期也是泛型,所以生命週期引數'a和泛型型別引數t都位於函式名後的同一尖括號列表中。

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

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

Rust筆記 Rust中的生命週期之協變

生命週期代表資源的可用時期。顯式生命週期標記是泛型引數的一種,但是有協變的概念。長生命週期作為短生命週期的子型別 宣告乙個變數,其生命週期開始,變數離開作用域,其生命週期結束。生命週期標記是一種泛型引數,標記的型別 僅當與引用 借用 相關聯時。多數情況下生命週期標記可以由編譯器為我們推導並標註。一些...

React 生命週期 生命週期方法

生命週期 掛載 更新 解除安裝 元件被建立 執行初始化 並被掛載到dom中,完成元件的第一次渲染 constructor props getderivedstatefromprops props,state render componentdidmount 元件被建立時會首先呼叫元件的構造方法,接受...