我有以下代码:

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的不变借入,而在下一行我们接受可变借入.但我们并没有borrow 整个Struct S,只是borrow 了 struct 中的引用.为什么借入仍处于活动状态?

我认为这与Get和Set中的生存期注释有关.这些函数是我试图"描述"相应的成员函数的外观.如果我将get的签名更改为fn get<'a, 'b>(S: &'a MyStruct<'b>) -> &'b str,代码就会编译.为什么签名会影响借阅的期限?

推荐答案

通过将get()中的生存期指定为fn(&'a MyStruct<'a>) -> &'a str,您就表示在字符串的生存期内borrow 了整个 struct .因为该字符串是在set()之后使用的,所以该时间段包括set().因此,在set()期间, struct 被borrow ,这是一个错误.

另一方面,如果将其指定为fn(&'b MyStruct<'a>) -> &'a str,则只为get()borrow struct ,并以不同的生存期返回内部的字符串.

Rust相关问答推荐

为什么在Rust struct 中只允许最后一个字段具有动态大小的类型

Tauri tauri—apps/plugin—store + zustand

如何从使用mockall模拟的方法中返回self?

go 掉包装 struct 中的泛型

无法实现整型类型的泛型FN

Rust移动/复制涉及实际复制时进行检测

什么是`&;[][..]`铁 rust 里的刻薄?

Rust 中什么时候可以返回函数生成的字符串切片&str?

处理带有panic 的 Err 时,匹配臂具有不兼容的类型

为什么 Rust 创建的 f32 小于 f32::MIN_POSITIVE?

带引脚和不带引脚的比较功能

闭包返回类型的生命周期规范

将多维数组转换为切片

Rust与_有何区别?

`tokio::pin` 如何改变变量的类型?

按下 Ctrl + C 时优雅地停止命令并退出进程

Rust:`sort_by` 多个条件,冗长的模式匹配

如何从 x86_64 Mac 构建 M1 Mac?

Rust 函数指针似乎被borrow 判断器视为有状态的

如果我立即等待,为什么 `tokio::spawn` 需要一个 `'static` 生命周期?