32.生命周期注释.rs
生活随笔
收集整理的這篇文章主要介紹了
32.生命周期注释.rs
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
/*更多文章參考:
https://github.com/rooat/RustLearn/blob/master/src/ch10-03-lifetime-syntax.md
https://github.com/rooat/RustLearn/blob/master/src/ch19-02-advanced-lifetimes.md
*///返回的是新生成的String,有自己的生命周期,如果使用&str的話生命周期跟隨他人
fn longer1(s1: String, s2: String) -> String {if s2.len() > s1.len() {s2 + "123"} else {s1 + "abc"}
}/*
expected named lifetime parameter
這個編譯不過原因
官方解釋:返回值引用可能會返回過期的引用(其實我沒看太懂,按說s1和s2傳進來有效那傳出去也肯定有效啊,難道是擔心返回其他值?)因為 Rust 并不知道將要返回的引用是指向 x 或 y。事實上我們也不知道,因為函數(shù)體中 if 塊返回一個 x 的引用而 else 塊返回一個 y 的引用!
fn longer2(s1: &str, s2: &str) -> &str {if s2.len() > s1.len() {s2} else {s1}}
*//*
生命周期注釋:
生命周期注釋是描述引用生命周期的辦法。雖然這樣并不能夠改變引用的生命周期,但可以在合適的地方聲明兩個引用的生命周期一致。
生命收起注釋用單引號開頭,跟著一個小寫字母單詞.
需要用泛型聲明來規(guī)范生命周期的名稱,隨后函數(shù)返回值的生命周期將與兩個參數(shù)的生命周期一致
&i32 // 常規(guī)引用
&'a i32 // 含有生命周期注釋的引用
&'a mut i32 // 可變型含有生命周期注釋的引用靜態(tài)生命周期:
生命周期注釋有一個特別的:'static 。所有用雙引號包括的字符串常量所代表的精確數(shù)據(jù)類型都是 &'static str ,'static 所表示的生命周期從程序運行開始到程序運行結(jié)束。
舉例:let s: &'static str = "I have a static lifetime.";
*/
fn longer3<'a>(s1: &'a str, s2: &'a str) -> &'a str {if s2.len() > s1.len() {s2} else {s1}
}/*即便我們?yōu)榉祷刂抵付松芷趨?shù) 'a,這個實現(xiàn)卻編譯失敗了,因為返回值的生命周期與參數(shù)完全沒有關聯(lián)
//returns a value referencing data owned by the current function
fn longer4<'a>(x: &str, y: &str) -> &'a str {let result = String::from("really long string");result.as_str()
}
*/fn main() {{//為什么這么可以編譯的過? 按說r的聲明周期和s1、s2是一樣的,出了作用域就過期了,按說應該編譯不過的啊let r;{let s1 = "rust";let s2 = "ecmascript";r = longer3(s1, s2);}println!("{} is longer", r);}let r;{let s1 = String::from("rust");let s2 = String::from("ecmascript");r = longer1(s1, s2);}println!("{} is longer", r);
}
?
總結(jié)
以上是生活随笔為你收集整理的32.生命周期注释.rs的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 31.错误处理.rs
- 下一篇: 33.文件与 IO.rs