数组和数组索引表达式
数组表达式
语法
数组表达式 :
[
数组元素?]
数组表达式用于构造数组。数组表达式有两种形式。
第一种形式列出了数组中的每个值。这种形式的语法是用方括号括起来的、以逗号分隔的、类型一致的表达式列表。这将生成一个数组,其中包含按编写顺序排列的每个值。
第二种形式的语法是用方括号括起来的、用分号 (;
) 分隔的两个表达式。分号 (;
) 前面的表达式称为*重复操作数*。分号 (;
) 后面的表达式称为*长度操作数*。它必须是 usize
类型,并且是一个常量表达式,例如字面量或常量项。这种形式的数组表达式创建一个数组,其长度为长度操作数的值,每个元素都是重复操作数的副本。也就是说,[a; b]
创建一个包含 b
个 a
值副本的数组。如果长度操作数的值大于 1,则要求重复操作数的类型为Copy
,或者它必须是路径指向一个常量项。
当重复操作数是一个常量项时,它会被求值长度操作数的次数。如果该值为 0
,则根本不会对常量项进行求值。对于不是常量项的表达式,它只会被求值一次,然后结果会被复制长度操作数的次数。
#![allow(unused)] fn main() { [1, 2, 3, 4]; ["a", "b", "c", "d"]; [0; 128]; // array with 128 zeros [0u8, 0u8, 0u8, 0u8,]; [[1, 0, 0], [0, 1, 0], [0, 0, 1]]; // 2D array 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)
。就像方法一样,Rust 也会在 a
上重复插入解引用操作,以找到一个实现。
数组和切片的索引是从零开始的。数组访问是一个常量表达式,因此可以在编译时使用常量索引值检查边界。否则,将在运行时执行检查,如果检查失败,则会使线程处于*恐慌状态*。
#![allow(unused)] fn main() { // lint is deny by default. #![warn(unconditional_panic)] ([1, 2, 3, 4])[2]; // Evaluates to 3 let b = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]; b[1][2]; // multidimensional array indexing let x = (["a", "b"])[10]; // warning: index out of bounds let n = 10; let y = (["a", "b"])[n]; // panics let arr = ["a", "b"]; arr[10]; // warning: index out of bounds }