将所有方法从一个类复制到另一个类

时间:2012-03-19 18:24:08

标签: ruby

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

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动态创建的,所以我不能只使用include。上面的代码传入cls,然后它找到实际写入该类的所有实例方法,而不是它继承的实例方法,然后创建一个具有相同名称的新方法。调用该方法时,它实际上使用其相同名称的方法调用另一个类。这非常有效,除非我有args。我有条件检查,看它是否有参数,然后让它调用带参数的方法,但它没有很好地处理哈希。它将哈希作为参数的数组,这不是我想要的。

我想知道是否有一种简单的方法可以直截了当地说“嘿,你知道这个方法,无论它是什么,字面意思为这个其他类做出同样的事情。”

3 个答案:

答案 0 :(得分:2)

你也可以尝试DelegateClass

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

答案 1 :(得分:0)

如果所有方法都相同,为什么不在两个类中包含的公共模块中定义它们呢?你提到不使用include,因为这些方法是动态定义的,但这并不意味着当你混合模块时就找不到它们:

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 :(得分:0)