如何在Ruby中仅使用其实例变量重新打开一个类?

时间:2012-08-30 16:06:21

标签: 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 个答案:

答案 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