범위 표현식
범위 표현식
연속된 값들을 한꺼번에 다루고 싶을 때, 시작과 끝만 정해 주면 나머지는 컴파일러가 채워 줬으면 좋겠다는 생각이 들죠. 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..11로 1부터 10까지 반복하는 전형적인 패턴이 그 예시예요.
#![allow(unused)]
fn main() {
for i in 1..11 {
println!("{}", i);
}
}
더 알아보기 (Learn more)
- Rust Reference - Range expressions — 본문 원문
- 러스트 표준 라이브러리 - ops::Range — 범위 타입의 세부 동작