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