Object#tap - 쉬어가기 메서드

이전글 - method_missing과 친절한 루비씨  전체보기

 

지난 글에서 Object#returning - 문법 사탕에 대해서 이야기한 바 있습니다. 지난 번에는 소개하지 않았는데 루비 개발버전(1.9)에도 비슷한 기능이 추가되었습니다. 바로 Object#tap 메서드입니다. 구현을 먼저 보지요.

 

  1. class Object
      def tap
        yield self
  2.     self
      end
    end

 

value를 인자로 받는 Object#returning과 달리, tap 메서드는 자신의 값(self)를 이용합니다. 그래서 어떤 값(value)을 반환하는데 이런 이런 작업을 수행한다는 Object#returning의 의미와는 달리, tap 메서드는 메서드 연쇄에 더 적합해 보입니다(참조: Hash#diff - 메서드 연쇄의 재미).

 

tap 메서드를 사용하면 메서드 연쇄를 계속 유지하면서, 특정 작업을 잠시 끼워넣을 수 있습니다. 그리고 루비 관례에 맞지않게 self를 반환하지 않아 연쇄를 깨뜨리는 메서드가 있을 때도 연쇄를 계속 이어갈 수 있게됩니다. 특히나, 개발 과정에서 디버깅 등의 목적으로 중간 결과값을 알고 싶을 때 유용합니다. 예를 들어보겠습니다. 아래는 지난 글에서 사용한 메서드 연쇄의 예입니다.

 

  1. [3,1,7,0].sort.reverse

 

여기서 sort까지의 결과를 알고 싶다면 번거롭게 아래처럼 3줄로 나눠써야 합니다. 연쇄가 깨지죠.

 

  1. temp = [3,1,7,0].sort
  2. p temp
  3. temp.reverse

 

하지만, tap을 이용하면 연쇄를 깨뜨릴 필요가 없습니다.

 

  1. [3,1,7,0].sort.tap{|ary| p ary}.reverse

 

연쇄 중간에 잠깐 쉬어간다는 의미에서 쉬어가기 메서드라는 제목을 붙여봤습니다. 루비 개발을 하다보면 tap이 절실한 경우가 나타날 것입니다. 빨리 정식 버전에 포함되기를! 물론, 정식 버전에 포함되지 않아도 항상 열려있는 루비 클래스의 특징때문에, 지금도 얼마든지 사용할 수 있지만 말입니다.

 

- 강문식

 

참고 자료