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

댓글 없음:

댓글 쓰기

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...