확인이 그것이 있어야하는 방식이 아니기 때문에 당신은 앱 디자인을 overthink해야하지만, 여기 요 - 이러한 방법 및 결정의 점점 목록을 모듈의 프록시.
얻기 목록은 조금 까다로울 수 있습니다 여기에
MyModule::UselessName.public_methods(false) - MyModule::UselessName.superclass.public_methods(false)
우리가 모든 공용 클래스 메소드의 목록을 시작하고 모든 슈퍼 클래스의 공용 클래스 메소드의 목록을 뺍니다.
이제 메서드 이름을 알고 있다고 가정하면 프록시 메서드를 만들어야합니다.
metaclass = class << MyModule; self; end
metaclass.send(:define_method, :x) do |*args, &block|
MyModule::UselessName.send(:x, *args, &block)
end
이 코드는 런타임에 다음 정의와 동일하게 만듭니다.
module MyModule
def x(*args, &block)
MyModule::UselessName.send(:x, *args, &block)
end
end
그럼 간단한 기능으로 정리해 보겠습니다.
def make_proxies(mod, cls)
methods = cls.public_methods(false) - cls.superclass.public_methods(false)
metaclass = class << mod; self; end
methods.each do |method|
metaclass.send(:define_method, method) do |*args, &block|
cls.send(method, *args, &block)
end
end
end
이제 모듈과 클래스를 호출하면됩니다. "대상"모듈은 클래스를 소유 한 "소스"모듈과 다를 수 있으므로 모든 메소드 (이름이 다르거 나 클래스 이름을 사용하여 접두어로 붙이는 경우)를 하나의 모듈에 적용 할 수 있습니다. 예 : 당신의 경우에는 다음 전화를하십시오.
make_proxies(MyModule, MyModule::UselessName)
달성하려는 목표는 무엇입니까? 왜'UselessName' 클래스를 생략하지 않습니까? – Vapire
내 질문을 편집했습니다. 나는 동일한 메소드 이름을 가진 다른 모듈을 가지고있다. –
그래서? 당신은'MyModule :: x'와 같은 메소드를 각각 호출하기를 원한다고 말합니다. 그래서 MyModule.x'는 클래스를 생략하고, 모듈에 넣고 이것을 호출합니다 ... 아니면 뭔가 빠졌습니까? 추신 : 메서드 이름은 소문자 여야합니다. 대문자는 상수입니다. CONSTANT – Vapire