2012-03-19 3 views
2

두 개의 클래스가 있으며 한 클래스에서 다른 클래스로 모든 메소드를 복사하려고합니다. 일부 메소드는 인수가 없으며 일부 메소드에는 인수가 있고 일부 메소드에는 인수로 해시가 있습니다. 그리고 나는 어떤 것들이 사전에 미리 모른다. 그래서이 코드를 만들었습니다. 인수를 고려하지 않았다는 것을 알아 냈습니다. 클래스에서 메서드 목록을 얻은 다음 다른 클래스에 정확하게 복제 할 수 있습니까?한 클래스에서 다른 클래스로 모든 메소드 복사하기

메소드는 첫 번째 클래스의 define_method를 사용하여 즉석에서 작성되므로 include를 사용할 수 없습니다. 위 코드는 cls가 전달 된 다음 상속받은 클래스가 아닌 해당 클래스에 실제로 작성된 인스턴스 메서드를 모두 찾은 다음 동일한 이름의 새 메서드를 만듭니다. 이 메소드가 호출되면, 실제로 같은 이름의 메소드로 다른 클래스를 호출합니다. 나는 args가 없으면 훌륭하게 작동합니다. 인수가 있는지 확인하기 위해 조건 검사를 수행 한 다음 인수를 사용하여 메서드를 호출했지만 해시를 제대로 처리하지 못했습니다. 해시를 인자에 대한 배열로 만들었는데, 이것은 내가 원한 것이 아닙니다.

나는 문자 그대로 "이 방법을 알았습니까?"라는 간단한 방법이 있는지 궁금합니다. 문자 그대로이 다른 클래스에서 똑같은 것을 만들 수 있습니다. "

+0

원하는 것을 혼동합니다. 당신은 인스턴스 메소드에 대해 이야기하고 있습니다 만, '다른 클래스를 같은 이름의 메소드로 호출합니다.'라고 말합니다. 당신이 다른 계급의 구속을 추적하지 않는다면 그것은 효과가 없습니다. – AShelly

답변

0

모든 방법이 동일한 경우 두 클래스에 모두 포함 된 공통 모듈에서 정의하는 것이 가장 좋은 이유는 무엇입니까? 당신은 방법이 동적으로 정의되기 때문에 포함 사용하지 언급하지만 그들은 당신이 모듈을 믹스 인 경우를 찾을 수 없습니다 의미하지 않는다 :

module Foo 
    def self.make_an_example_method(name) 
    define_method(name) do |*args| 
     puts "I am #{name} called with (#{args.inspect})" 
    end 
    end 
end 

class A 
    include Foo 
end 

class B 
    include Foo 
end 

Foo.make_an_example_method(:example) 
Foo.make_an_example_method(:dynamic) 

A.new.example   # => I am example called with ([]) 
B.new.dynamic(1,2,3) # => I am dynamic called with ([1, 2, 3]) 
2

당신은 또한 수를 시도해보십시오. DelegateClass :

class NamedArray < DelegateClass(Array) 
    def initialize n 
    @name = n 
    super(Array.new) 
    end 
    def sayName 
    "My name is #{@name}" 
    end 
end 
관련 문제