将方法添加到实例化对象
obj = SomeObject.new def obj.new_method "do some things" end puts obj.new_method > "do some things"
这工作正常。 但是,我需要在现有的方法中做同样的事情:
def some_random_method def obj.new_method "do some things" end end
工作也没关系,但是在一个方法里面有一个方法看起来非常糟糕。 问题是,有没有其他方法可以添加这种方法?
我问这个问题已经很久了。 在ruby 1.9+中,通过使用define_singleton_method
有一个更好的方法,如下所示:
obj = SomeObject.new obj.define_singleton_method(:new_method) do "do some things" end
使用Mixin。
module AdditionalMethods def new_method "do some things" end end obj = SomeObject.new obj.extend(AdditionalMethods) puts obj.new_method > "do some things"
你可以使用模块。
module ObjSingletonMethods def new_method "do some things" end end obj.extend ObjSingletonMethods puts obj.new_method # => do some things
现在,如果您需要向该对象添加更多方法,则只需在模块中实现方法即可完成。
只是有趣的一点要注意:
如果你已经去了:
def my_method def my_other_method; end end
然后, my_other_method
实际上是在对象的CLASS上定义的,而my_method
的接收者是一个实例。
但是,如果你去(像你一样):
def my_method def self.my_other_method; end end
然后my_other_method
在实例的my_other_method
上定义。
与你的问题没有直接的关系,但有点有趣;)