我想创建一个与传递给它的类混淆的函数。重新打开这些类以添加功能的最惯用方法是什么?这就是我的意思:
def class_messer(target_object)
#would like to reopen class here with something like:
class target_object.class
#add methods
end
end
显然语法不起作用。我可以得到target_object的类并评估一些字符串,但这感觉很糟糕。有没有更惯用的方法呢?
答案 0 :(得分:5)
我认为你正在寻找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
答案 1 :(得分:2)
target_object.class.class_exec do
# add methods
end
答案 2 :(得分:2)
更改类可能不正确,例如,如果您有一个Array类的实例并更改了它的类,那么此更改可能会影响Array类的其他实例。因此,使用singleton class实例,方法的定义将是:
target_object.send(:define_method, :new_method) do
#...
end
或
class << target_object
def new_method
#...
end
end
答案 3 :(得分:0)
你也可以这样做:
class << target_object.class
end