让我们尝试编译这段代码:
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()
失败了?它是编译器错误吗?
答案 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
,代码现在将使用内置索引。