数组和数组索引表达式

数组表达式

语法
数组表达式 :
   [ 数组元素组? ]

数组元素组 :
      表达式 ( , 表达式 )* ,?
   | 表达式 ; 表达式

数组表达式 构造 数组 。 数组表达式有两种形式。

第一种形式列出数组中的每个值。 这种形式的语法是将类型相同的表达式列表用逗号隔开并用方括号括起来。 这会产生一个包含按照书写顺序排列的这些值的数组。

第二种形式的语法是两个表达式之间用分号 (;) 隔开并用方括号括起来。 分号前的表达式称为 重复操作数 。 分号后的表达式称为 长度操作数 。 它必须是类型为 usize 的 常量表达式 ,例如 字面值常量条目 。 这种形式的数组表达式会创建一个长度为长度操作数的值的数组,每个元素都是重复操作数的副本。 也就是说,[a; b] 创建一个包含 b 个 a 值的副本的数组。 如果长度操作数的值大于 1 ,则要求重复操作数的类型是 Copy ,或者必须是指向常量条目的 路径

当重复操作数是常量条目时,它会被计算长度操作数的值的次数。 如果该值为 0 ,则不会对常量条目进行计算。 对于不是常量条目的表达式,则进行一次计算,然后将结果以长度操作数的次数复制。

#![allow(unused)]
fn main() {
[1, 2, 3, 4];
["a", "b", "c", "d"];
[0; 128];              // 数组为 128 个 0 
[0u8, 0u8, 0u8, 0u8,];
[[1, 0, 0], [0, 1, 0], [0, 0, 1]]; // 二维数组
const EMPTY: Vec<i32> = Vec::new();
[EMPTY; 2];
}

数组和切片索引表达式

语法
索引表达式 :
   表达式 [ 表达式 ]

数组切片 类型的值可以通过在它们后面写一个类型为 usize 的方括号括起来的表达式进行索引。 当数组是可变的,其结果的 内存位置 可以被赋值。

对于其他类型,索引表达式 a[b] 等价于 *std::ops::Index::index(&a, b) ,或者,在可变占位表达式的上下文中等价于 *std::ops::IndexMut::index_mut(&mut a, b) 。就像方法一样,会对 a 解引用以找到实现。

数组和切片的索引是从零开始。 数组访问是一个 常量表达式 ,因此如果索引值是常量,编译时可以进行边界检查。 否则,运行时会进行检查,如果检查失败,则线程将置于 恐慌状态

#![allow(unused)]
fn main() {
// 默认情况下 lint 为 deny。
#![warn(unconditional_panic)]

([1, 2, 3, 4])[2];        // 计算结果为 3

let b = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];
b[1][2];                  // 多维数组索引

let x = (["a", "b"])[10]; // 警告:索引越界

let n = 10;
let y = (["a", "b"])[n];  // 引发 panic

let arr = ["a", "b"];
arr[10];                  // 警告:索引越界
}

数组索引表达式可以通过实现 IndexIndexMut trait 来实现其他类型的索引。