1

我想创建一个函数来处理传递给它的类。重新打开这些类以添加功能的最惯用的方法是什么?这就是我的意思:

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

4 回答 4

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
于 2012-08-30T17:09:49.830 回答
2

也许改变类是不正确的,例如,如果你有一个 Array 类的实例并改变了它的类,那么这个改变可能会影响到 Array 类的其他实例。所以改为使用单例类的实例,方法的定义将是:

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

或者

class << target_object
  def new_method
    #...
  end
end
于 2012-08-30T16:32:22.650 回答
2
target_object.class.class_exec do
  # add methods
end
于 2012-08-30T16:10:43.413 回答
0

你也可以这样做:

class << target_object.class

end
于 2012-08-30T16:21:07.157 回答