小编jna*_*nko的帖子

Rust:为什么借用结构内部的引用会借用整个结构?

我有以下代码:

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,代码就会编译。为什么签名会影响借款期限?

lifetime rust borrow-checker

2
推荐指数
1
解决办法
297
查看次数

标签 统计

borrow-checker ×1

lifetime ×1

rust ×1