我有两个类,我想将所有方法从一个类复制到另一个类。有些方法没有参数,有些方法会有参数,有些方法会有哈希作为参数。我从来不知道会有哪些会。所以我创建了这段代码,直到我发现它没有考虑到参数。有没有办法从类中获取方法列表,然后将它们完全克隆到另一个类?
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。我有条件检查,看它是否有参数,然后让它调用带参数的方法,但它没有很好地处理哈希。它将哈希作为参数的数组,这不是我想要的。
我想知道是否有一种简单的方法可以直截了当地说“嘿,你知道这个方法,无论它是什么,字面意思为这个其他类做出同样的事情。”
答案 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)
您可以尝试SimpleDelegator:http://www.ruby-doc.org/stdlib-1.9.3/libdoc/delegate/rdoc/SimpleDelegator.html