相关疑难解决方法(0)

为什么借入仍然存在于if的else块中?

为什么self.f2()以下代码中的调用会使借用检查程序运行?是不是在另一个范围内的else块?这是一个相当难的问题!

use std::str::Chars;

struct A;

impl A {
    fn f2(&mut self) {}

    fn f1(&mut self) -> Option<Chars> {
        None
    }

    fn f3(&mut self) {
        if let Some(x) = self.f1() {

        } else {
            self.f2()
        }
    }
}

fn main() {
    let mut a = A;
}
Run Code Online (Sandbox Code Playgroud)

操场

error[E0499]: cannot borrow `*self` as mutable more than once at a time
  --> src/main.rs:16:13
   |
13 |         if let Some(x) = self.f1() {
   |                          ---- first mutable borrow occurs here
... …
Run Code Online (Sandbox Code Playgroud)

rust

10
推荐指数
2
解决办法
2384
查看次数

如果向量为空,如何在插入值时避免向量的多个可变借位?

这个github讨论中,你会发现这个代码引起了借用检查器的愤怒:

fn main() {
    let mut vec = vec!();

    match vec.first() {
        None => vec.push(5),
        Some(v) => unreachable!(),
    }
}
Run Code Online (Sandbox Code Playgroud)

我理解为什么在不可变借用突出的情况下进行突变是有问题的.我假设一个解决方案是明确地只有一个借用(一个可变的),但它仍然导致我有两个借款,一个不可变的借款,然后是一个可变的借款:

fn main() {
    let mut vec: Vec<i32> = vec!();

    let r_vec: &mut Vec<i32> = &mut vec;

    match r_vec.first() {
       None => r_vec.push(5),
       Some(v) => unreachable!(),
   }   
} 
Run Code Online (Sandbox Code Playgroud)

编译器仍然不满意:

error[E0502]: cannot borrow `*r_vec` as mutable because it is also borrowed as immutable
 --> testrust.rs:7:17
  |
6 |     match r_vec.first() {
  |           ----- immutable borrow occurs here
7 | …
Run Code Online (Sandbox Code Playgroud)

rust borrow-checker

4
推荐指数
1
解决办法
627
查看次数

标签 统计

rust ×2

borrow-checker ×1