Blocks and Iterators
이번 세션에서는 간단하게 Ruby의 장점중에 하나를 설명하겠습니다. 코드 블럭을 살펴보려고 합니다. 코드 블럭은 callback을 구현하거나(Java의 anonymous inner class보다 간단하게), 코드 덩어리(C의 funtion pointer보다 더 유연한)를 넘겨주거나, 이터레이터를 구현할 때 사용할 수 있습니다.
코드 블럭은 ( )사이 또는 do 와 end 사이의 코드 덩어리 입니다.
{ puts "Hello" } # this is a block
do #
club.enroll(person) # and so is this
person.socialize #
end #
코드 블럭을 만들어 두고 yield 를 사용하여 여러번 호출 할 수 있습니다.
def callBlock
yield
yield
end
callBlock { puts "In the block" }
callBlock 이라는 메소드 안에는 yield 를 두 번 사용했습니다. 그리고 오른쪽에 코드 블럭이 있군요. 그럼 이 코드 블럭을 두 번 호출 하게 될 테니 화면에 in the block 가 두번 찍힐 것입니다.
In the block
In the block
You can provide parameters to the call to
yield
: these will be passed to the block. Within the block, you
list the names of the arguments to receive these parameters between
vertical bars (``|'').
def callBlock yield , end callBlock { |, | ... }
코드 블럭은 Ruby에서 이터레이터를 구현할 때 사용됐습니다.
a = %w( ant bee cat dog elk ) # create an array
a.each { |animal| puts animal } # iterate over the contents
이 것의 결과는 다음과 같습니다.
ant
bee
cat
dog
elk
each라는 메소드가 어떻게 구현되어 있는지 보겠습니다.
# within class Array...
def each
for each element
yield(element)
end
end
You could then iterate over an array's elements by calling itseach
method and supplying a block. This block would be called foreach element in turn.
[ 'cat', 'dog', 'horse' ].each do |animal| |
produces:
cat -- dog -- horse --
Java와 C에서 사용하는 여러 loof를 Ruby에서는 단순한 메소드 호출을 사용하여 할 수 있습니다.
5.times { print "*" }
3.upto(6) {|i| print i }
('a'..'e').each {|char| print char }
produces:
*****3456abcde
*을 출력하는 코드 블럭을 다섯번 호출하고, 3~6까지 출력하고, a~e까지 출력했습니다.