簡體   English   中英

Rust:為什么在struct內部借用引用會借用整個struct?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM