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!
Forwardable와 SingleForwardable 둘 다 쓰고 싶다면, def_instance_delegator와 def_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_delegators는 def_single_delegators의 별칭이고, delegate는 single_delegate의 별칭이에요. 참고로 __send__·__id__ 같은 메서드는 def_single_delegators에서 자동으로 제외돼요.