我的模块定义如下所示:
module RG::Stats
def self.sum(a, args = {})
a.inject(0){ |accum, i| accum + i }
end
end
要使用此方法,我只需要包含此定义的文件,以便我可以执行以下操作:
RG::Stats.sum(array)
并且
RG::Stats.method(:sum)
但是,如果我需要知道使用的方法列表RG::Stats.instance_methods
我得到一个空数组。这是因为我用过self
。如果我省略self
then RG::Stats.instance_methods
给出了方法列表,但我无法再访问它们。
问题是:如何使用self
在模块的方法定义中?
Use self
在每个方法定义中,如果您希望仅在模块的单例类中定义方法(其中使用定义的方法self
居住)。省略自我和extend self
如果您希望模块的方法同时定义为实例方法和单例方法。
例如,您可以使用以下方式调用该方法RG::Stats.sum(array)
并且仍然将其列出instance_methods
方法,如果你这样做:
module RG::Stats
extend self
def sum(a, args = {})
a.inject(0){ |accum, i| accum + i }
end
end
这样,sum
方法被定义为实例方法,使用后包含在模块的单例类中extend self
.
您可以检查实例方法RG::Stats
模块来验证这一点:
RG::Stats.instance_methods
=> [:sum]
使用这种技术,您不必担心在没有self
关键字,因为模块不能有实例,所以它不能像实例方法一样被调用RG::Stats
模块。只能作为单例方法调用RG::Stats.sum(array)
感谢extend self
陈述。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)