[英]Rust: why does borrowing a reference inside struct borrow the whole struct?
我有以下代碼:
struct MyStruct<'a>{
data: &'a str,
}
fn get<'a>(S: &'a MyStruct<'a>) -> &'a str{
S.data
}
fn set<'a>(S: &'a mut MyStruct<'a>, x: &'a str){
S.data = x;
}
fn main(){
let mut S = MyStruct{data: "hello"};
let foo: &str = get(&S);
set(&mut S, "goodbye");
dbg!(foo);
}
編譯失敗是因為let bar: &str = get(&S)
對 S 進行了不可變借用,而在下一行我們進行了可變借用。 但是我們並沒有借用整個Struct S,只是借用了struct內部的引用。 為什么借用仍然有效?
我覺得跟get和set中的lifetime annotations有關系。 這些函數是我嘗試“脫糖”的相應成員函數的樣子。 如果我將get
的簽名更改為fn get<'a, 'b>(S: &'a MyStruct<'b>) -> &'b str
,代碼將編譯。 為什么簽名會影響借用的期限?
通過將get()
中的生命周期指定為fn(&'a MyStruct<'a>) -> &'a str
,您說您在字符串的生命周期內借用了整個結構。 因為字符串在set()
之后使用,所以該時間段包括set()
。 因此,在set()
期間,結構被借用,這是一個錯誤。
另一方面,如果您將其指定為fn(&'b MyStruct<'a>) -> &'a str
,則您僅為get()
借用該結構,並以不同的生命周期返回內部字符串.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.