struct - 在结构体的字段中使用引用时是否有任何限制?

标签 struct rust lifetime

我试图了解 Rust 中的生命周期如何影响结构。附件是一个让我困惑的最小例子。
我想给一个 struct 一个对象的引用,然后有必要更改这个对象。由于借用时无法更改对象,因此我认为必须在更改时删除引用。所以我的想法是将变量定义为一个选项,并通过将其设置为 None 来删除对象修改过程中的引用。 .对于不使用 Struct 的示例,这似乎有效。
但是,如果我现在将此引用放入 Struct 中,则它不起作用。在我看来,借用检查器忽略了变量 string 的事实。不再借。有没有办法仍然使用结构实现所需的行为?
这有效( link to playground ):

fn main() {
    let mut string = "mutable string".to_string();
    let mut ref_to_string: Option<&str> = Some(&string);
    ref_to_string = None;
    string = "mutated string".to_string();
    ref_to_string = Some(&string);
}
但是,这不起作用 link to playground :
struct Foo<'a> {
    pub ref_data: Option<&'a str>,
}

fn main() {
    let mut string = "mutable string".to_string();
    let mut foo = Foo{ref_data: Some(&string)};
    foo.ref_data = None;
    string = "mutated string".to_string();
    foo.ref_data = Some(&string);
}

错误信息:
error[E0506]: cannot assign to `string` because it is borrowed
  --> src/main.rs:11:5
   |
9  |     let mut foo = Foo{ref_data: Some(&string)};
   |                                      ------- borrow of `string` occurs here
10 |     foo.ref_data = None;
11 |     string = "mutated string".to_string();
   |     ^^^^^^ assignment to borrowed `string` occurs here
12 |     foo.ref_data = Some(&string);
   |     ---------------------------- borrow later used here

For more information about this error, try `rustc --explain E0506`.

最佳答案

问题是您正在引用 string变量两次。借用第一个时绑定(bind)&str至少像 foo 一样活着.引用位于“另一个”变量中的另一个字符串应该没有问题:

fn main() {
    let string = "mutable string".to_string();
    let mut foo = Foo {
        ref_data: Some(&string),
    };
    foo.ref_data = None;

    let string = "mutated string".to_string();
    foo.ref_data = Some(&string);
}

Playground
通知使用另一个 let绑定(bind)而不是改变变量。

关于struct - 在结构体的字段中使用引用时是否有任何限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69541461/

相关文章:

c++ - 重用存储是否开始新对象的生命周期?

c# - 结构上的方法调用?

rust - Arc in Rust 中的临时生命周期

multithreading - 如何将对堆栈变量的引用传递给线程?

rust - 如何处理可以拥有或借用的 FFI 未确定大小的类型?

c - 如何对表示时间表的数组结构对象进行排序

c - 试图将结构成员复制到 c 中的字节数组

multithreading - 如何将通用 T 发送到另一个线程?

error-handling - 如何将 fold 与 Result 返回值一起使用?

rust - 使 String 类型与 ARM 兼容?