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|
 print animal, " -- "
end

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까지 출력했습니다.


Leave a Reply

Your email address will not be published. Required fields are marked *