SingleForwardable

SingleForwardable

SingleForwardable객체 단위로 위임(delegation)을 설정할 수 있게 해 주는 모듈이에요.

출처: Ruby 3.3 API

본문

먼저 일반 객체에 위임을 설정하는 예시예요.

printer = String.new
printer.extend SingleForwardable        # prepare object for delegation
printer.def_delegator "STDOUT", "puts"  # add delegation for STDOUT.puts()
printer.puts "Howdy!"

또한 SingleForwardable은 클래스나 모듈에도 위임을 설정하는 데 쓸 수 있어요.

class Implementation
  def self.service
    puts "serviced!"
  end
end

module Facade
  extend SingleForwardable
  def_delegator :Implementation, :service
end

Facade.service #=> serviced!

ForwardableSingleForwardable 둘 다 쓰고 싶다면, def_instance_delegatordef_single_delegator 같은 메서드를 이용하면 돼요.

Public Instance Methods

def_single_delegator(accessor, method, new_name=method)

accessor로 위임하는 메서드 method를 정의해요. 즉, accessor에서 같은 이름의 메서드를 호출하는 거예요. new_name을 주면 위임 메서드 이름으로 그걸 써요. 정의한 메서드의 이름을 돌려줘요. def_delegator의 별칭이에요.

def_single_delegators(accessor, *methods)

여러 위임 메서드를 한 번에 정의하는 단축 메서드예요. 이름을 다르게 쓸 수는 없어요. 다음 두 코드는 같은 효과예요.

def_delegators :@records, :size, :<<, :map

def_delegator :@records, :size
def_delegator :@records, :<<
def_delegator :@records, :map

def_delegatorsdef_single_delegators의 별칭이고, delegatesingle_delegate의 별칭이에요. 참고로 __send__·__id__ 같은 메서드는 def_single_delegators에서 자동으로 제외돼요.