加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 21:14:58 所属栏目:百科 来源:网络整理
导读:我的模块定义如下所示: module RG::Stats def self.sum(a,args = {}) a.inject(0){ |accum,i| accum + i } endend 要使用此方法,我只需要包含此定义的文件,以便我可以执行以下操作: RG::Stats.sum(array) 并且 RG::Stats.method(:sum) 但是,如果我需要知道
我的模块定义如下所示:
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,那么RG :: Stats.instance_methods会给出方法列表,但我不能再访问它们了.

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

解决方法

如果希望仅在模块的单例类中定义方法(使用self live定义的方法),请在每个方法定义中使用self.如果希望将模块的方法同时定义为实例方法和单例方法,则省略self并扩展self.

例如,您可以使用RG :: Stats.sum(数组)调用该方法,如果执行此操作,仍然可以通过instance_methods方法列出该方法:

module RG::Stats
  extend self

  def sum(a,i| accum + i }
  end
end

这样,sum方法被定义为实例方法,并且在使用extend self之后它被包含在模块的singleton类中.

您可以检查RG :: Stats模块的实例方法来验证这一点:

RG::Stats.instance_methods
=> [:sum]

使用此技术,您不必担心在没有self关键字的情况下定义方法,因为模块不能拥有实例,因此无法像RG :: Stats模块的实例方法那样调用它.由于扩展自我声明,它只能被称为单例方法RG :: Stats.sum(数组).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读