【问题标题】:How does Rust implement array indexing?Rust 如何实现数组索引?
【发布时间】:2018-06-25 01:54:13
【问题描述】:

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

一个数组在 Rust 中是可变的,它可以被多次访问,而不仅仅是一次。 “值读取”、“引用读取”和“可变引用读取”之间有什么区别?我写了一个程序如下,但出现了一些错误。

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

【问题讨论】:

  • 我不认为Arrays 默认是可变的;因此你的错误。
  • 如果你熟悉 C++...value reads 映射到 return-by-value 语义,reference reads 映射到 const-correct return-by-reference 语义,而 mutable reference reads 在大多数情况,只是指return-by-reference语义。

标签: arrays rust indices mutability


【解决方案1】:

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");
}

【讨论】:

  • 您并没有真正回答 OP 的问题:Rust 如何实现数组读取功能?“值读取”、“参考读取”和“可变参考读取”?
  • 我已经更改了代码并将数组xs 转换为可变数组,但我仍然不知道这三种读取数组的方式有什么区别。你能给我解释一下吗?
  • @Coding_Rabbit 我稍微扩展了答案;我认为现在更清楚了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多