2011년 6월 2일 목요일

Block and Iterators

Block and Iterators

Code Blocks, 코드 블록은 마치 형식인수처럼 메서드 호출과 결할 할 수 있는 코드이다. 이것은 루비가 가진 놀란 만큼 강력한 기능이다. 코드 블록을 이용해서 콜백을 구현할 수도 있고, 코드의 일부를 함수에 넘길 수 이고, 반복자를 구현 할 수도 있다. 코드 블록은 "{}"나 "do...end"로 묶인 코드다.

{ puts "Hello" }       # this is a block


do                     #
 club.enroll(person)  # and so is this
 person.socialize     #
end                    #

중괄호는 do/end 쌍보다 높은 우선순위를 갖는다. 보통 한 줄의 블록에는 중괄호를, 여러줄의 블록에서는 do/end를 사용한다.
아래는 puts "Hi"를 수행하는 블록을 greet 메서드 호출과 결합하고 있다.

greet { puts "Hi" }

메서드에 형식인수가 있다면 블록 앞에 넣어준다.

verbose_greet("Dave", "loyal customer") { puts "Hi" }

메서드에서는 루비의 "yield"문을 이용해서 결합된 코드 블록을 여러 차례 실행수 있다.

def callBlock
 yield
 yield
end
callBlock { puts "In the block" }

» In the block
» In the block

블록 안에 있는 puts "In the block"은 yield가 불릴 때마다 한 번씩 총 두 번 실행된다.
yield문에 형식인수를 적으면 코드 블록에 이 값이 매개변수로 전달 된다.

def call_block
   yield("hello", 99)
end

call_back { |str, nul| ... }

루비 라이브러리에서는 코드 블럭을 반복자(Iterators)를 구현하기 위해 사용하기도 한다.

a = %w( ant bee cat dog elk )    # create an array
a.each { |animal| puts animal }  # iterate over the contents

» ant
» bee
» cat
» dog
» elk

5.times {  print "*" }
3.upto(6) {|i|  print i }
('a'..'e').each {|char| print char }
» *****3456abcde

위 예제는 숫자 5객체에 코드 블록을 5번 수행할 것을 요청하고, 숫자 3 객체에 6일 될때 까지 증가면서 코드 블록을 수행하고, a에서 e까지의 범위에 각각에 대해서 블록을 실행한다.

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

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