SingleForwardable 모듈
SingleForwardable 모듈
SingleForwardable은 객체 수준에서 위임(delegation)을 설정할 수 있게 해주는 모듈이에요. Forwardable이 클래스/모듈 수준에서 메서드를 위임한다면, 이 모듈은 개별 객체 하나에 위임을 붙이고 싶을 때 써요.
출처: Ruby 4.0 API
본문
개별 객체 하나에 위임 메서드를 추가하고 싶다면 extend SingleForwardable로 시작해요.
printer = String.new
printer.extend SingleForwardable # prepare object for delegation
printer.def_delegator "STDOUT", "puts" # add delegation for STDOUT.puts()
printer.puts "Howdy!"
STDOUT의 puts 메서드를 printer 객체에 위임해서, printer.puts 호출이 그대로 STDOUT.puts로 이어지는 거예요.
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_delegator(accessor, method, new_name=method)
method라는 이름의 메서드를 정의해서 accessor에 위임해요. 즉 accessor에서 같은 이름의 메서드를 호출하죠. new_name을 주면 그 이름으로 위임 메서드를 만들어요. 정의된 메서드의 이름을 반환해요.
class Printer
extend SingleForwardable
def_delegator :@queue, :push
def_delegator :@queue, :push, :enqueue # enqueue라는 이름으로 위임
end
def_delegators(accessor, *methods)
위임 메서드를 여러 개 한 번에 정의하는 지름길이에요. 이름을 바꿔 쓰는 기능은 없어요. 다음 두 코드는 같은 효과를 내요:
def_delegators :@records, :size, :<<, :map
def_delegator :@records, :size
def_delegator :@records, :<<
def_delegator :@records, :map
def_single_delegator(accessor, method, new_name=method)
객체 수준에서 위임 메서드를 하나 정의해요. def_delegator의 동작과 같지만 단일 객체에 적용된다는 점만 달라요. 정의된 메서드의 이름을 반환해요.
def_single_delegators(accessor, *methods)
객체 수준에서 위임 메서드를 여러 개 한 번에 정의하는 지름길이에요. def_delegators와 같지만 단일 객체에 적용돼요.
delegate(method, accessor)
def_single_delegator의 별칭으로, 위임 메서드를 하나 정의해요.
single_delegate(accessor, method)
객체 수준에서 위임 메서드를 정의하는 또 다른 형태예요.