高能建站系統(tǒng)怎么收費查詢網(wǎng)站流量的網(wǎng)址
Rust 第17節(jié) 生命周期
先看一段錯誤代碼
/*
//一段錯誤的代碼
// Rust 編譯時會報錯;
*/let r;{let x = 5;r = &x;}println!("{}",r);
Rust 在編譯時使用 借用檢查器, 比較作用域來檢查所有的借用是否合法;
很明顯;r 引用了 x; 但是x 的生命周期比r短;所以就有問題;
再看下一段代碼
fn logest(x : &str,y : &str) -> &str {if x.len() > y.len() {x} else {y }
}
看著沒有問題,但是編譯器會報錯;是由于,輸入的兩個引用,和輸出的一個引用;這么多引用,編譯器不知道他們的生命周期的關系;所以報錯;
生命周期標注
解決方法:
手動標注生命周期
//需要手動指示生命周期; 簡單理解就是返回值的生命周期和傳入的參數(shù)周期一致,都是'a
fn logest<'a>(x : & 'a str,y : &'a str) -> & 'a str {if x.len() > y.len() {x} else {y }
}
上邊的方式為生命周期標注
生命周期的標注不會改變引用的生命周期長度
當指定了泛型生命周期參數(shù),函數(shù)可以接收帶有任何生命周期的引用
它的本質是描述多個引用的生命周期間的關系,但不影響生命周期
標注語法
生命周期標注語法
以 ’ 開頭,全小寫,很短;通常都使用 'a
在 & 后邊,用空格與類型分開
上邊例子中的’a 就是 x,y中較小的那個
結構體中的生命周期標注
// 當結構體的成員有引用時,就需要存在標注struct Import<'a> {part : & 'a str,
}//這里表示 part的生命周期要和結構體一樣長;
生命周期標注省略
任何引用都需要標注生命周期
有的標注編譯器可以完成,所以不需要標注;
編譯器通過三個方法來判斷引用的生命周期,這三個方法的情況下,可以省略生命周期標注
適用于 fn 和 impl
- 應用于輸入生命周期;(函數(shù)的傳參)
每個引用類型的參數(shù)都有自己的生命周期 - 應用于輸出生命周期 (函數(shù)的返回值)
如果只有一個輸入生命周期參數(shù),那么該生命周期都將賦給所有的輸出生命周期參數(shù) - 應用于輸出生命周期 (函數(shù)的返回值)
如果有多個輸入?yún)?shù)生命周期參數(shù),但其中一個是 &self 或 & mut self ;那么self 的生命周期將賦給所有的輸出生命周期參數(shù)
靜態(tài)生命周期
'static 是一個特殊的生命周期,表示的是 整個程序的持續(xù)時間。