| r[expr.tuple] | |
| # Tuple and tuple indexing expressions | |
| ## Tuple expressions | |
| r[expr.tuple.syntax] | |
| ```grammar,expressions | |
| TupleExpression -> `(` TupleElements? `)` | |
| TupleElements -> ( Expression `,` )+ Expression? | |
| ``` | |
| r[expr.tuple.result] | |
| A *tuple expression* constructs [tuple values][tuple type]. | |
| r[expr.tuple.intro] | |
| The syntax for tuple expressions is a parenthesized, comma separated list of expressions, called the *tuple initializer operands*. | |
| r[expr.tuple.unary-tuple-restriction] | |
| 1-ary tuple expressions require a comma after their tuple initializer operand to be disambiguated with a [parenthetical expression]. | |
| r[expr.tuple.value] | |
| Tuple expressions are a [value expression] that evaluate into a newly constructed value of a tuple type. | |
| r[expr.tuple.type] | |
| The number of tuple initializer operands is the arity of the constructed tuple. | |
| r[expr.tuple.unit] | |
| Tuple expressions without any tuple initializer operands produce the unit tuple. | |
| r[expr.tuple.fields] | |
| For other tuple expressions, the first written tuple initializer operand initializes the field `0` and subsequent operands initializes the next highest field. For example, in the tuple expression `('a', 'b', 'c')`, `'a'` initializes the value of the field `0`, `'b'` field `1`, and `'c'` field `2`. | |
| Examples of tuple expressions and their types: | |
| | Expression | Type | | |
| | -------------------- | ------------ | | |
| | `()` | `()` (unit) | | |
| | `(0.0, 4.5)` | `(f64, f64)` | | |
| | `("x".to_string(), )` | `(String, )` | | |
| | `("a", 4usize, true)`| `(&'static str, usize, bool)` | | |
| r[expr.tuple-index] | |
| ## Tuple indexing expressions | |
| r[expr.tuple-index.syntax] | |
| ```grammar,expressions | |
| TupleIndexingExpression -> Expression `.` TUPLE_INDEX | |
| ``` | |
| r[expr.tuple-index.intro] | |
| A *tuple indexing expression* accesses fields of [tuples][tuple type] and [tuple structs][tuple struct]. | |
| The syntax for a tuple index expression is an expression, called the *tuple operand*, then a `.`, then finally a tuple index. | |
| r[expr.tuple-index.index-syntax] | |
| The syntax for the *tuple index* is a [decimal literal] with no leading zeros, underscores, or suffix. For example `0` and `2` are valid tuple indices but not `01`, `0_`, nor `0i32`. | |
| r[expr.tuple-index.required-type] | |
| The type of the tuple operand must be a [tuple type] or a [tuple struct]. | |
| r[expr.tuple-index.index-name-operand] | |
| The tuple index must be a name of a field of the type of the tuple operand. | |
| r[expr.tuple-index.result] | |
| Evaluation of tuple index expressions has no side effects beyond evaluation of its tuple operand. As a [place expression], it evaluates to the location of the field of the tuple operand with the same name as the tuple index. | |
| Examples of tuple indexing expressions: | |
| ```rust | |
| // Indexing a tuple | |
| let pair = ("a string", 2); | |
| assert_eq!(pair.1, 2); | |
| // Indexing a tuple struct | |
| # struct Point(f32, f32); | |
| let point = Point(1.0, 0.0); | |
| assert_eq!(point.0, 1.0); | |
| assert_eq!(point.1, 0.0); | |
| ``` | |
| > [!NOTE] | |
| > Unlike field access expressions, tuple index expressions can be the function operand of a [call expression] as it cannot be confused with a method call since method names cannot be numbers. | |
| > [!NOTE] | |
| > Although arrays and slices also have elements, you must use an [array or slice indexing expression] or a [slice pattern] to access their elements. | |
| [array or slice indexing expression]: array-expr.md#array-and-slice-indexing-expressions | |
| [call expression]: ./call-expr.md | |
| [decimal literal]: ../tokens.md#integer-literals | |
| [field access expressions]: ./field-expr.html#field-access-expressions | |
| [operands]: ../expressions.md | |
| [parenthetical expression]: grouped-expr.md | |
| [place expression]: ../expressions.md#place-expressions-and-value-expressions | |
| [slice pattern]: ../patterns.md#slice-patterns | |
| [tuple type]: ../types/tuple.md | |
| [tuple struct]: ../types/struct.md | |
| [value expression]: ../expressions.md#place-expressions-and-value-expressions |