2012-03-19 123 views
2

我有两个类,我想将所有方法从一个类复制到另一个类。有些方法不会有参数,有些会有参数,有些会有散列作为参数。而且我从来不知道哪些人会。所以我创建了这个代码,直到我发现它没有考虑到参数。有没有办法从一个Class中获取方法列表,然后将它们完全克隆到另一个类中?将所有方法从一个类复制到另一个类

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,然后它会找到所有实际写入该类的实例方法,而不是它继承的实例方法,然后创建一个具有相同名称的新方法。当这个方法被调用时,它实际上用同名的方法调用另一个类。这很有用,除非我有参数。我有条件检查,看它是否有参数,然后让它调用一个带参数的方法,但它没有很好地处理哈希。它将散列作为一个参数的数组,这不是我想要的。

我在想,如果有一个简单的方法来从字面上说,“嘿,你知道这个方法,不管它是什么,硬是让同样的事情,这个其他类。”

+0

我很困惑你想做什么。你正在讨论实例方法,但是你会说'用同名的方法调用另一个类。除非你跟踪其他班级的情况,否则这是行不通的。 – AShelly 2012-03-19 18:45:17

回答

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 
相关问题