Skip to content

Latest commit

 

History

History
68 lines (51 loc) · 1.86 KB

range-expr.md

File metadata and controls

68 lines (51 loc) · 1.86 KB

r[expr.range]

Range expressions

r[expr.range.syntax]

RangeExpression ->
      RangeExpr
    | RangeFromExpr
    | RangeToExpr
    | RangeFullExpr
    | RangeInclusiveExpr
    | RangeToInclusiveExpr

RangeExpr -> Expression `..` Expression

RangeFromExpr -> Expression `..`

RangeToExpr -> `..` Expression

RangeFullExpr -> `..`

RangeInclusiveExpr -> Expression `..=` Expression

RangeToInclusiveExpr -> `..=` Expression

r[expr.range.behavior] The .. and ..= operators will construct an object of one of the std::ops::Range (or core::ops::Range) variants, according to the following table:

Production Syntax Type Range
RangeExpr start..end [std::ops::Range] start ≤ x < end
RangeFromExpr start.. [std::ops::RangeFrom] start ≤ x
RangeToExpr ..end [std::ops::RangeTo] x < end
RangeFullExpr .. [std::ops::RangeFull] -
RangeInclusiveExpr start..=end [std::ops::RangeInclusive] start ≤ x ≤ end
RangeToInclusiveExpr ..=end [std::ops::RangeToInclusive] x ≤ end

Examples:

1..2;   // std::ops::Range
3..;    // std::ops::RangeFrom
..4;    // std::ops::RangeTo
..;     // std::ops::RangeFull
5..=6;  // std::ops::RangeInclusive
..=7;   // std::ops::RangeToInclusive

r[expr.range.equivalence] The following expressions are equivalent.

let x = std::ops::Range {start: 0, end: 10};
let y = 0..10;

assert_eq!(x, y);

r[expr.range.for] Ranges can be used in for loops:

for i in 1..11 {
    println!("{}", i);
}