我有以下代码:
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,而在下一行中,我们使用可变的借入。但我们并没有借用整个结构S,只是结构内部的参考。为什么借款仍然活跃?
我认为这与get和set中的生存期注释有关。这些函数是我尝试"desugar“的相应成员函数的样子。如果我将get的签名更改为fn get<'a, 'b>(S: &'a MyStruct<'b>) -> &'b str,代码将编译。为什么签名会影响借款的期限?
发布于 2022-11-27 01:46:01
通过将get()中的生存期指定为fn(&'a MyStruct<'a>) -> &'a str,您可以说您借用了字符串生命周期的整个结构。因为字符串是在set()之后使用的,所以这个时间段包括set()。因此,在set()期间,结构被借用,这是一个错误。
另一方面,如果将其指定为fn(&'b MyStruct<'a>) -> &'a str,则只为get()借用结构,并返回具有不同生存期的字符串。
https://stackoverflow.com/questions/74586882
复制相似问题