2012-03-19 9 views
2

私は2つのクラスを持っていて、すべてのメソッドをあるクラスから別のクラスにコピーしたいと思います。いくつかのメソッドは引数を持たず、いくつかは引数を持ち、またいくつかは引数としてハッシュを持ちます。そして、私は決して事前に誰が決めるのか分からない。だから私はこのコードを作成しましたが、引数を考慮していないことが分かりました。クラスからメソッドのリストを取得し、それを別のクラスに正確に複製する方法はありますか?すべてのメソッドをあるクラスから別のクラスにコピーする

def partial(cls) 
    cls.instance_methods(false).each do |method_name| 
    define_method(method_name) do 
     cls.new.method(method_name.to_sym).call 
    end 
    end 
end 

方法はファーストクラスでdefine_method使ってその場で作成されているので、私はちょうど含める使用することはできません。上記のコードには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

あなたは可能性も試してみてください:

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