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

时间:2017-11-19 08:58:18

标签: rust

让我们尝试编译这段代码:

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 个答案:

答案 0 :(得分:4)

  

是编译器错误吗?

Yes。它被修复为Rust 1.25.0-nightly(2018-01-09 61452e506f0c88861cccaeea4ced3419bdb3cbe0)PR 47167

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

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

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

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