元组和元组索引表达式

tuple-expr.md
commit: 09142b820fe8713c4cba451713c7d11e67d7fbd8
本章译文最后维护日期:2021-4-6

元组表达式

句法
TupleExpression :
   ( InnerAttribute* TupleElements? )

TupleElements :
   ( Expression , )+ Expression?

元组表达式用来构建元组值

元组表达式的句法规则为:一对圆括号封闭的以逗号分隔的表达式列表,这些表达式被称为元组初始化操作数(tuple initializer operands)。 为了避免和圆括号表达式混淆,一元元组表达式的元组初始化操作数后的逗号不能省略。

元组表达式是一个值表达式,它会被求值计算成一个元组类型的新值。 元组初始化操作数的数量构成元组的元数(arity)。 没有元组初始化操作数的元组表达式生成单元元组(unit tuple)。 对于其他元组表达式,第一个被写入的元组初始化操作数初始化第 0 个元素,随后的操作数依次初始化下一个开始的元素。 例如,在元组表达式 ('a', 'b', 'c') 中,'a' 初始化第 0 个元素的值,'b' 初始化第 1 个元素,'c' 初始化第2个元素。

元组表达式和相应类型的示例:

表达式类型
()() (unit)
(0.0, 4.5)(f64, f64)
("x".to_string(), )(String, )
("a", 4usize, true)(&'static str, usize, bool)

元组表达式上的属性

在允许块表达式上的属性存在的那几种表达式上下文中,可以在元组表达式的左括号后直接使用内部属性

元组索引表达式

句法
TupleIndexingExpression :
   Expression . TUPLE_INDEX

元组索引表达式被用来存取元组或[元组结构体][tuple structs]的字段。

元组索引表达式的句法规则为:一个被称为*元组操作数(tuple operand)*的表达式后跟一个 .,最后再后跟一个元组索引。 元组索引的句法规则要求该索引必须写成一个不能有前导零、下划线和后缀的十进制字面量的形式。 例如 02 是合法的元祖索引,但 010_0i32 这些不行。

元组操作数的类型必须是元组类型或[元组结构体][tuple structs]。 元组索引必须是元组操作数类型的字段的名称。(译者注:这句感觉原文表达有问题,这里也给出原文 The tuple index must be a name of a field of the type of the tuple operand.)

对元组索引表达式的求值计算除了能求取其元组操作数的对应位置的值之外没有其他作用。 作为位置表达式,元组索引表达式的求值结果是元组操作数字段的位置,该字段与元组索引同名。

元组索引表达式示例:


#![allow(unused)]
fn main() {
// 索引检索一个元组
let pair = ("a string", 2);
assert_eq!(pair.1, 2);

// 索引检索一个元组结构体
struct Point(f32, f32);
let point = Point(1.0, 0.0);
assert_eq!(point.0, 1.0);
assert_eq!(point.1, 0.0);
}

注意:与字段访问表达式不同,元组索引表达式可以是调用表达式的函数操作数。 (这之所以可行,)因为元组索引表达式不会与方法调用相混淆,因为方法名不可能是数字。

注意:虽然数组和切片也有元素,但它们必须使用数组或切片索引表达式切片模式去访问它们的元素。