有没有方法来创建方法只为一个Ruby类的实例从该实例?

让类实例定义为:

class Example
  def initialize(test='hey')
    self.class.send(:define_method, :say_hello, lambda { test })
  end
end

调用Example.new; Example.new我得到一个警告:方法重新定义;废弃老say_hello。这个,我总结,必须是因为它定义了一个方法在实际的类(这是有道理的,从语法)。当然,如果在方法中有不同值的Example的多个实例,那将会是灾难性的。

有没有办法只为一个类的实例创建方法从那个实例?

最佳答案
您需要获取对实例的singleton类的引用,该类保存所有特定于实例的内容,并在其上定义方法。在ruby 1.8中,它看起来有点凌乱。 (如果你找到一个更清洁的解决方案让我知道!)

Ruby 1.8

class Example
  def initialize(test='hey')
    singleton = class << self; self end
    singleton.send :define_method, :say_hello, lambda { test }
  end
end

Ruby 1.9但是,提供了一个更容易的方法。

Ruby 1.9

class Example
  def initialize(test='hey')
    define_singleton_method :say_hello, lambda { test }
  end
end

转载注明原文:有没有方法来创建方法只为一个Ruby类的实例从该实例? - 代码日志