gpt4 book ai didi

Rust:为什么在 struct 中借用引用会借用整个 struct?

转载 作者:行者123 更新时间:2023-12-01 22:49:56 40 4
gpt4 key购买 nike

我有以下代码:

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() 借用结构, 并返回具有不同生命周期的字符串。

关于Rust:为什么在 struct 中借用引用会借用整个 struct?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74586882/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com