2012-03-19 118 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 
相關問題