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