범위 표현식

범위 표현식

연속된 값들을 한꺼번에 다루고 싶을 때, 시작과 끝만 정해 주면 나머지는 컴파일러가 채워 줬으면 좋겠다는 생각이 들죠. Rust의 범위 표현식(range expression) 이 바로 그 역할을 해요. ....= 연산자로 값의 구간을 만들어 내요.

출처: Rust Reference

본문

구문 (Syntax)

RangeExpression →
      RangeExpr
    | RangeFromExpr
    | RangeToExpr
    | RangeFullExpr
    | RangeInclusiveExpr
    | RangeToInclusiveExpr

RangeExpr → Expression .. Expression

RangeFromExpr → Expression ..

RangeToExpr → .. Expression

RangeFullExpr → ..

RangeInclusiveExpr → Expression ..= Expression

RangeToInclusiveExpr → ..= Expression

동작 (Behavior)

....= 연산자는 아래 표에 따라 std::ops::Range(또는 core::ops::Range) 변종 중 하나의 객체를 만들어 내요.

생산 규칙 (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

예시를 볼게요.

#![allow(unused)]
fn main() {
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
}

등가 표현 (Equivalence)

다음 두 표현식은 서로 같아요. 구조체 리터럴로 Range를 직접 만든 것과 .. 문법으로 만든 것이 동일한 값을 의미한다는 걸 보여 주죠.

#![allow(unused)]
fn main() {
let x = std::ops::Range {start: 0, end: 10};
let y = 0..10;

assert_eq!(x, y);
}

for 루프에서의 사용

범위는 for 루프에서도 쓸 수 있어요. for i in 1..111부터 10까지 반복하는 전형적인 패턴이 그 예시예요.

#![allow(unused)]
fn main() {
for i in 1..11 {
    println!("{}", i);
}
}

더 알아보기 (Learn more)