2014년 1월 3일 금요일

[ROR] yield self

안녕하세요 belhyun입니다.
ROR에서 module이나 class 내부에서 yield self를 사용할 수 있습니다.
yield self의 의미는 호출된 block을 호출하고 그 파라미터로 self를 던진다는 의미입니다. 다음의 예를 통해 알아보도록 하겠습니다.
class Pokemon
  def initialize(move)
    @move = move
  end
 
  def battle
    yield self
  end
 
  def use_move
    puts "used #{@move}!"
  end
end
 
mewtwo = Pokemon.new "Psychic"
 
mewtwo.battle do |m2|
  m2.use_move
end
 
# => used Psychic!
 
arceus = Pokemon.new "Judgement"
 
arceus.battle do |arc|
  arc.use_move
end

위 클래스를 보면 battle 메소드에서 yield self가 사용되고 있음을 확인할 수 있습니다.
먼저 Pokemon의 인스턴스인 mewtwo의 메소드인 battle에 block을 전달합니다. 이 블락은 yield self를 만나 실행되게 됩니다. 단 이 block에 전달되는 파라미터는 self입니다. 그렇기 때문에 m2에 self가 바인딩됩니다. 이어서 self의 use_move가 호출되는데 이 메소드에서는 인스턴스 변수인 @move에 접근합니다. 그렇기 때문에 결과적으로 used Psychic!이 호출됩니다. 아래의 코드도 같은 의미로 해석할 수 있습니다.

감사합니다.

댓글 없음:

댓글 쓰기