diff --git a/src/expressions/array-expr.md b/src/expressions/array-expr.md index 1b0699890..0fd5427a9 100644 --- a/src/expressions/array-expr.md +++ b/src/expressions/array-expr.md @@ -10,19 +10,30 @@ >       [_Expression_] ( `,` [_Expression_] )\* `,`?\ >    | [_Expression_] `;` [_Expression_] -An _[array](../types/array.md) expression_ can be written by -enclosing zero or more comma-separated expressions of uniform type in square -brackets. This produces an array containing each of these values in the -order they are written. +An _[array] expression_ can be written by enclosing zero or more +comma-separated expressions of uniform type in square brackets. This produces +an array containing each of these values in the order they are written. Alternatively there can be exactly two expressions inside the brackets, -separated by a semi-colon. The expression after the `;` must have type -`usize` and be a [constant expression], -such as a [literal](../tokens.md#literals) or a [constant -item](../items/constant-items.md). `[a; b]` creates an array containing `b` -copies of the value of `a`. If the expression after the semi-colon has a value -greater than 1 then this requires that the type of `a` is -[`Copy`](../special-types-and-traits.md#copy). +separated by a semicolon. The expression after the `;` must have type `usize` +and be a [constant expression], such as a [literal] or a [constant item]. `[a; +b]` creates an array containing `b` copies of the value of `a`. If the +expression after the semicolon has a value greater than 1 then this requires +that the type of `a` is [`Copy`], or `a` must be a path to a constant item. + +When the repeat expression `a` is a constant item, it is evaluated `b` times. +If `b` is 0, the constant item is not evaluated at all. For expressions that +are not a constant item, it is evaluated exactly once, and then the result is +copied `b` times. + +
+ +Warning: In the case where `b` is 0, and `a` is a non-constant item, there is +currently a bug in `rustc` where the value `a` is evaluated but not dropped, +thus causing a leak. See [issue +#74836](https://github.com/rust-lang/rust/issues/74836). + +
```rust [1, 2, 3, 4]; @@ -30,6 +41,8 @@ greater than 1 then this requires that the type of `a` is [0; 128]; // array with 128 zeros [0u8, 0u8, 0u8, 0u8,]; [[1, 0, 0], [0, 1, 0], [0, 0, 1]]; // 2D array +const EMPTY: Vec = Vec::new(); +[EMPTY; 2]; ``` ### Array expression attributes @@ -44,10 +57,9 @@ expressions]. > _IndexExpression_ :\ >    [_Expression_] `[` [_Expression_] `]` -[Array](../types/array.md) and [slice](../types/slice.md)-typed expressions can be -indexed by writing a square-bracket-enclosed expression of type `usize` (the -index) after them. When the array is mutable, the resulting [memory location] -can be assigned to. +[Array] and [slice]-typed expressions can be indexed by writing a +square-bracket-enclosed expression of type `usize` (the index) after them. +When the array is mutable, the resulting [memory location] can be assigned to. For other types an index expression `a[b]` is equivalent to `*std::ops::Index::index(&a, b)`, or @@ -81,11 +93,16 @@ arr[10]; // warning: index out of bounds The array index expression can be implemented for types other than arrays and slices by implementing the [Index] and [IndexMut] traits. +[`Copy`]: ../special-types-and-traits.md#copy [IndexMut]: ../../std/ops/trait.IndexMut.html [Index]: ../../std/ops/trait.Index.html [Inner attributes]: ../attributes.md [_Expression_]: ../expressions.md [_InnerAttribute_]: ../attributes.md +[array]: ../types/array.md [attributes on block expressions]: block-expr.md#attributes-on-block-expressions [constant expression]: ../const_eval.md#constant-expressions +[constant item]: ../items/constant-items.md +[literal]: ../tokens.md#literals [memory location]: ../expressions.md#place-expressions-and-value-expressions +[slice]: ../types/slice.md