Rust如何实现数组索引?

时间:2018-01-16 11:09:32

标签: arrays rust indices mutability

我正在学习子结构类型系统,而Rust就是一个很好的例子。

一个数组在Rust中是可变的,可以多次访问,而不是只访问一次。 "值读取","参考读取和#34;之间的区别是什么?和"可变参考读取"?我写了一个程序如下,但我遇到了一些错误。

fn main() {
    let xs: [i32; 5] = [1, 2, 3, 4, 5];
    println!("first element of the array: {}", xs[1]);
    println!("first element of the array: {}", &xs[1]);
    println!("first element of the array: {}", &mut xs[1]);
}

以下是错误消息:

error[E0596]: cannot borrow immutable indexed content `xs[..]` as mutable
 --> src/main.rs:5:53
  |
2 |     let xs: [i32; 5] = [1, 2, 3, 4, 5];
  |         -- consider changing this to `mut xs`
...
5 |     println!("first element of the array: {}", &mut xs[1]);
  |                                                     ^^^^^ cannot mutably borrow immutable field

1 个答案:

答案 0 :(得分:4)

xs 可变;为了使其可变,其绑定必须包含mut关键字:

let mut xs: [i32; 5] = [1, 2, 3, 4, 5];

添加时,您的代码将按预期工作。我推荐the relevant section in The Rust Book

Rust中的索引是由IndexIndexMut特征提供的操作,并且如文档中所述,它是*container.index(index)*container.index_mut(index)的语法糖,这意味着它提供了对索引元素的直接访问(不仅仅是引用)。使用assert_eq比较可以更好地看出您列出的3个操作之间的差异:

fn main() {
    let mut xs: [i32; 5] = [1, 2, 3, 4, 5];

    assert_eq!(xs[1], 2); // directly access the element at index 1
    assert_eq!(&xs[1], &2); // obtain a reference to the element at index 1
    assert_eq!(&mut xs[1], &mut 2); // obtain a mutable reference to the element at index 1

    let mut ys: [String; 2] = [String::from("abc"), String::from("def")];

    assert_eq!(ys[1], String::from("def"));
    assert_eq!(&ys[1], &"def");
    assert_eq!(&mut ys[1], &mut "def");
}