2011년 6월 2일 목요일

Standard Types : Ranges

Ranges

1월에서 12월, 0에서 9까지 등 다양한 Sequence, Condition, Interval을 구현하는 데 범위를 사용한다.

Ranges as Sequences

범위의 가장 자연스러운 사용법은 바로 시퀀스를 표현하는 것이다. 시퀀스는 시작값, 종료값 차례로 값을 만들어 내는 방법이다. 경계를 포함 하는 "..", 경계를 포함하지 않는 "..." 범위 연산자를 이용해서 만든다.
1..10
'a'..'z'
my_array = [0,1,2,3,4]
puts 0... my_array.length

>> 0...5

시퀀스를 리스트로 바꾸고 싶으면 to_a 메서드를 사용하면 된다.

range = 0..4
array_range = range.to_a
puts array_range

범위 구성요소를 반복 하거나 다양한 벙법으로 검사할수 있다.
digits = 0..9
digits.include?(5)»true
digits.min»0
digits.max»9
digits.reject {|i| i < 5 }»[5, 6, 7, 8, 9]


직 접 만든 객체도 범위를 지원하도록 할 수 있다. 이를 위해 객체가 순서대로 다음 객체를 반환하는succ 메서드를 구현해야 하고, 비교 연산자 <=>를 이용해서 비교 가능해야 한다. <=> 연산자는 두값을 비교하여 첫째 값이 둘째 값보다 작으면 -1, 같으면 0 크면 1를 반환한다.

class VU

 include Comparable
 attr :volume

 def initialize(volume)  # 0..9
@volume = volume
 end
 
 def inspect
'#' * @volume
 end
 
 # Support for ranges
 
 def <=>(other)
self.volume <=> other.volume
 end
 
 def succ
raise(IndexError, "Volume too big") if @volume >= 9
VU.new(@volume.succ)
 end
 
end

VU 클래스가 succ와 <=> 메서드를 구현했기 때문에 범위로 사용할 수 있다.

medium = VU.new(4)..VU.new(7)
medium.to_a
medium.include?(VU.new(3))

Ranges as Intervals

어떤 값이 범위에 포함되어있는지 "===" 연산자를 이용해 알수 있다.
(1..10)    === 5»true
(1..10)    === 15»false
(1..10)    === 3.14159»true
('a'..'j') === 'c'»true
('a'..'j') === 'z'»false

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...