티스토리 뷰

Blocks

블록은 클로저 혹은 익명함수와 비슷합니다. 즉 이름 없는 메서드를 생성하는 방법이라고 할 수 있으며, do...end 혹은 {} 로 정의합니다.

블록은 처리를 하나의 단위로 묶은 것으로, 메서드 호출 시 한번만 지정할 수 있는 인자의 일종입니다. 이런 메서드 호출을 블록 메서드 호출이라고 합니다.

리시버.메소드명(args) do |param| action end
object.method { |placeholder| action }

# File#open 메서드 예시
File.open("readme.md") do |file|
  pusts file.read
end

# Array#each 메서드 사용 예시 - 블록을 파라미터로 받음
my_array = [1, 2, 3, 4, 5]
my_array.each do |n|
    n *= n
    puts n
end
# ==> 1, 4, 9, 16, 25 출력

Yield

메서드 호출시 block의 표현식은 호출된 메서드의 yield로 전달됩니다. 즉, 메서드 내부에 yield가 있을 경우, 메서드 호출시 block을 공급해야 합니다.

# yield 사용법
def check_yield
  puts "before yield"
  yield
  puts "after yield"
end

check_yield { puts "block" }
## 결과
# before yield
# block
# after yield


# 파라미터가 있는 yield
def check_yield_with_param(item)
  puts "before yield"
  yield(item)
  puts "after yield"
end

check_yield_with_param("block") { |item| puts "#{item}" }

메소드에 블록이 부여되었는지 판단하기 위해 block_given? 메서드를 사용합니다.

# block_given? 은 메소드가 블록을 인수로 호출한 경우 true를 반환
def block_given_sample
  puts "before yield"
  yield if block_given?
  puts "after yield"
end

# 블록이 없을 경우
block_given_sample        #=> "before yield" "after yield"

# 블록을 지정할 경우
block_given_sample do
  puts "block"
end                    #=> "before yield" "block" "after yield"

'Ruby & Rails' 카테고리의 다른 글

Ruby 처음 배우기 : 상속  (0) 2018.05.11
Ruby 처음 배우기 : Class  (0) 2018.05.11
Ruby 처음 배우기 : 메서드  (0) 2018.05.10
Ruby 처음 배우기 : 반복문  (1) 2018.05.10
Ruby 처음 배우기 : 조건문  (0) 2018.05.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함