jna*_*nko 2 lifetime rust borrow-checker
我有以下代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
这无法编译,因为let bar: &str = get(&S)采用了 S 的不可变借用,而在下一行我们采用了可变借用。但我们并没有借用整个 Struct S,只是借用了结构体内部的引用。为什么借贷仍然有效?
我认为这与 get 和 set 中的生命周期注释有关。这些函数是我尝试“脱糖”相应成员函数的外观。get如果我将的签名更改为fn get<'a, 'b>(S: &'a MyStruct<'b>) -> &'b str,代码就会编译。为什么签名会影响借款期限?
get()通过在to be中指定生命周期fn(&'a MyStruct<'a>) -> &'a str,您可以说您在字符串的生命周期内借用了整个结构。由于该字符串在 后使用set(),因此该时间段包括set()。因此,在set()结构被借用期间,这是一个错误。
另一方面,如果您将其指定为fn(&'b MyStruct<'a>) -> &'a str,则仅为 借用该结构get(),并以不同的生命周期返回其中的字符串。
| 归档时间: |
|
| 查看次数: |
297 次 |
| 最近记录: |