代码之家  ›  专栏  ›  技术社区  ›  chabapok

为什么有时可能从不可变数组借用mut引用(&M)?

  •  8
  • chabapok  · 技术社区  · 7 年前

    让我们试着编译以下代码:

    trait Bar {
        fn bar(&mut self);
    }
    
    fn foo(a1: &mut Bar, j: usize) {
        let a = [a1];
        a[0].bar(); //compilation ok
        a[j % 2].bar();
    }
    
    fn main() {}
    

    编译错误:

    error[E0596]: cannot borrow immutable local variable `a` as mutable
     --> src/main.rs:8:5
      |
    6 |     let a = [a1];
      |         - consider changing this to `mut a`
    7 |     a[0].bar(); //compilation ok
    8 |     a[j % 2].bar();
      |     ^ cannot borrow mutably
    

    为什么是 a[0].bar() 好的,但是 a[j % 2].bar() 失败?这是编译器错误吗?

    1 回复  |  直到 7 年前
        1
  •  4
  •   Shepmaster Tim Diekmann    7 年前

    这是编译器错误吗?

    Yes . 每晚(2018-01-09 61452e506f0c88861ccaeaea4ced3419bdb3cbe0)用铁锈固定 PR 47167

    简短的版本是,有两种执行索引的方法,称为“内置索引”和“重载索引”。正如您可以从名称中猜测的那样,一个是编译器的固有特性,另一个是用户可自定义的。

    在这种情况下,重载索引正在执行不必要的数组借用,从而触发警告。您可以通过简化编译器的类型推断作业来解决此问题:

    fn foo(a1: &mut Bar, j: usize) {
        let a = [a1];
        let x: usize = j % 2;
        a[x].bar();
    }
    

    通过明确说明索引是 usize ,代码现在将使用内置索引。