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
型
也可以,但是在一个方法中包含一个方法看起来很可怕。问题是,有没有其他方法可以添加这样的方法?
9条答案
按热度按时间nwlls2ji1#
在ruby 1.9+中,有一种更好的方法可以使用
define_singleton_method
,如下所示:字符串
holgip5t2#
使用Mixin。
字符串
b5buobof3#
有几种方法可以实现这一点,它们都与单例类有关:
1.你可以使用
class <<
习惯用法来打开单例类定义:字符串
1.或者你可以在obj上使用
define_singleton_method
:型
1.你也可以在singleton类中使用
define_method
:型
1.也可以直接使用
def
:型
注意例子3,我认为单例类的概念在那上面变得更清晰了。这两个例子之间有区别:
型
这是因为每个对象都有自己的单例类:
型
wlwcrazw4#
只是一个有趣的点要注意:
如果你去了:
字符串
那么
my_other_method
实际上是在对象的CLASS上定义的,尽管my_method
的接收者是一个示例。但是如果你去(就像你做的那样):
型
然后
my_other_method
被定义在示例的特征类上。与你的问题没有直接关系,但有点有趣;)
tjvv9vkg5#
你可以使用模块。
字符串
现在,如果你需要向该对象添加更多的方法,你只需要在模块中实现这些方法,就完成了。
xghobddn6#
使用
instance_eval
:字符串
nxowjjhe7#
字符串
class << obj
意味着我们正在为一个对象打开类的定义。正如你可能知道的,我们可以使用这样的语法来定义Ruby类方法:型
然后我们可以像这样使用这些方法:
型
在Ruby中,所有东西都是对象--甚至类也是。
self
在这里是Math class
本身的对象(你可以用Math.class
访问那个对象)。所以语法class << self
意味着我们为Math class object
打开了类。是的,它意味着Math class
也有类(Math.class.class)。dwthyt8l8#
另一种使用Mixin的方法
字符串
这包括从
AnotherModule
到当前对象的所有方法。jvidinwx9#
使用
define_singleton_method
是在稍后尝试转储对象时出现错误singleton can't be dumped
的原因。看起来,为示例化的对象设置一个新属性就足够满足我的需要了。
字符串
它部分地回答了这个问题,因为设置为
obj
的函数是由attr_accessor
设置的(而不是任意设置的)。但是,当属性足够时,它仍然是一个解决方案。