Range 리터럴
Range 리터럴 (Range Literals)
Range는 두 값 사이의 구간(interval)을 나타내요. 보통 두 개 또는 세 개의 점으로 이루어진 range 리터럴로 만들 수 있습니다.
x..y: 점 두 개는 포함(포함) 범위를 나타내요.x와y, 그리고 그 사이의 모든 값이 포함됩니다 (수학에서는[x, y]).x...y: 점 세 개는 배타적(제외) 범위를 나타내요.x와y직전까지의 모든 값이 포함됩니다 (수학에서는[x, y)).
(0..5).to_a # => [0, 1, 2, 3, 4, 5]
(0...5).to_a # => [0, 1, 2, 3, 4]
참고: range 리터럴은 종종 괄호로 감싸요. 예를 들어 호출의 수신자로 쓰려고 할 때 말이죠.
0..5.to_a처럼 괄호 없이 쓰면, 메서드 호출과 다른 연산자가 range 리터럴보다 우선순위가 높기 때문에 의미상0..(5.to_a)와 같아져 버려요.
어느 것이 포함이고 어느 것이 제외인지 기억하는 쉬운 방법은, 추가된 점이 _y_를 더 멀리 밀어내서 범위 밖으로 보내는 것으로 생각하는 거예요.
리터럴 x..y는 명시적 생성자 Range.new(x, y)와, x...y는 Range.new(x, y, true)와 의미상 동등합니다.
시작값과 끝값이 꼭 같은 타입일 필요는 없어요. true..1도 유효한 range지만, 호환되지 않는 타입에서는 Enumerable 메서드가 동작하지 않으므로 꽤 쓸모없습니다. 최소한 비교 가능해야 해요.
nil로 시작하는 range를 시작 없는(begin-less) range, nil로 끝나는 range를 끝 없는(end-less) range라고 불러요. 리터럴 표기법에서는 nil을 생략할 수 있습니다. x..는 x에서 시작하는 끝 없는 range이고, ..x는 x에서 끝나는 시작 없는 range예요.
numbers = [1, 10, 3, 4, 5, 8]
numbers.select(6..) # => [10, 8]
numbers.select(..6) # => [1, 3, 4, 5]
numbers[2..] = [3, 4, 5, 8]
numbers[..2] = [1, 10, 3]
시작도 없고 끝도 없는 range도 유효하며 ..나 ...로 표현할 수 있지만, 보통은 그리 쓸모가 없어요.
더 알아보기 (Learn more)
- Crystal 공식 문서 - Range
- Range API — Range 타입