2012-08-30 17 views
1

我想創建一個函數,通過傳遞給它的類來解決問題。重新打開這些類以添加功能的最習慣方法是什麼?這就是我的意思:如何在Ruby中使用其實例變量重新打開一個類?

def class_messer(target_object) 
    #would like to reopen class here with something like: 
    class target_object.class 
    #add methods 
    end 
end 

很明顯,該語法不起作用。我可以得到target_object的類,並評估一些字符串,但是感覺很糟糕。有沒有更習慣的方式來做到這一點?

回答

4

我認爲你正在尋找class_eval。如果你想重新打開一個類,但你沒有這個常量,而是一個引用,你可以調用class_eval,並傳遞一個代碼塊(或者甚至是一串字符串)來在那個類上下文中進行評估。

def class_messer(target_object) 

    # assuming that target_object is an instance of desired class 

    target_object.class.class_eval do 
    #add methods 
    end 

end 
+0

完美,謝謝。 – HaskellMan

2
target_object.class.class_exec do 
    # add methods 
end 
0

你也可以這樣做:

class << target_object.class 

end 
+0

您定義的方法有類方法 –

2

也許這是不正確的改變類,例如,如果你有Array類的實例,並改變了它的類,那麼這一變化可能會影響上Array類的其他實例。因此,而不是使用實例的singleton class和方法的定義是:

target_object.send(:define_method, :new_method) do 
    #... 
end 

class << target_object 
    def new_method 
    #... 
    end 
end 
相關問題