gpt4 book ai didi

ruby - 何时在模块的方法中使用 self

转载 作者:数据小太阳 更新时间:2023-10-29 06:48:27 24 4
gpt4 key购买 nike

我的模块定义如下:

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,则 RG::Stats.instance_methods 会给出方法列表,但我无法再访问它们。

问题是:如何在模块的方法定义中使用self

最佳答案

如果您希望方法仅在模块的单例类中定义(使用 self 定义的方法存在),请在每个方法定义中使用 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 的实例方法那样被调用: :统计 模块。由于 extend self 语句,它只能作为单例方法调用 RG::Stats.sum(array)

关于ruby - 何时在模块的方法中使用 self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32751805/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com