我正在学习子结构类型系统,而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
答案 0 :(得分:4)
xs
不可变;为了使其可变,其绑定必须包含mut
关键字:
let mut xs: [i32; 5] = [1, 2, 3, 4, 5];
添加时,您的代码将按预期工作。我推荐the relevant section in The Rust Book。
Rust中的索引是由Index
和IndexMut
特征提供的操作,并且如文档中所述,它是*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");
}