rust - 不能作为不可变借用,因为它也作为可变借用

标签 rust borrow-checker

我有以下最小示例来重现此问题:

fn main() {
    let mut vec = Vec::from(["Hello"]);
    let mut some_struct = SomeStruct { field: "World" };
    some_struct.doSomething(&mut vec);
    
    println!("{:?}", vec);
}

struct SomeStruct<'a> {
    field: &'a str
}

impl<'a> SomeStruct<'a> {
    fn doSomething(&mut self, vec: &'a mut Vec<&'a str>) {
        vec.push(self.field);
    }
}

(显然,doSomething 在此示例中不需要对 self 进行可变引用,但我确实需要原始代码中的可变引用)

当我运行上面的示例时,出现以下错误:

error[E0502]: cannot borrow `vec` as immutable because it is also borrowed as mutable
  --> src/main.rs:22:22
   |
20 |     some_struct.doSomething(&mut vec);
   |                             -------- mutable borrow occurs here
21 |
22 |     println!("{:?}", vec);
   |                      ^^^
   |                      |
   |                      immutable borrow occurs here
   |                      mutable borrow later used here
   |
   = note: this error originates in the macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info)

doSomething 可变借用后,如何打印出 vec

我已经尝试克隆 vecRefCell,但似乎没有任何效果。

最佳答案

问题是 &'a mut Vec<...> .重复一生通常是错误的。在这种情况下,您告诉 Rust “我想借用 vec 换取 'a”。但是'aself.field 决定, 并被推断为 'static在这里(或不;这并不重要。最重要的部分是它被推断为更长/等于 self 的生命周期,因为否则 self 将持有悬空引用)。现在借vec对于 'a ,您至少在 self 之前阻止使用它被摧毁。

如果删除 'a生命周期从 vec , it works :

fn doSomething(&mut self, vec: &mut Vec<&'a str>) {
    vec.push(self.field);
}

关于rust - 不能作为不可变借用,因为它也作为可变借用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72355536/

相关文章:

rust - 当借用在方法调用之后时如何借用两个不相交的字段?

algorithm - 迭代过滤功能,可修改树状结构

rust - 为什么对 `fn pop(&mut self) -> Result<T, &str>` 的调用继续借用我的数据结构?

rust - 保存可变引用以备后用,即使在使用别名时也是如此

rust - 尝试在比赛中改变结构时借用检查器问题

winapi - 为什么从 Rust 调用 SystemParametersInfo 来设置壁纸会将其设置为黑色?

mongodb - 替代将 'await'与lazy_static一起使用!使用rust 的宏?

rust - 借用的值没有足够长的时间,试图公开迭代器而不是数据的具体 Vec 表示

rust - 如何从宏中的表达式参数中获取标识符?

rust - Rust crate 功能需要单独安装吗?