首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Ruby中初始化模块的实例变量?

如何在Ruby中初始化模块的实例变量?
EN

Stack Overflow用户
提问于 2009-03-30 17:56:53
回答 3查看 73.3K关注 0票数 83

我有一些模块,我想在其中使用实例变量。我目前是这样初始化它们的:

module MyModule
  def self.method_a(param)
    @var ||= 0
    # other logic goes here
  end
end

我也可以调用init方法来初始化它们:

def init
  @var = 0
end

但这意味着我必须记住总是调用它。

有没有更好的方法来做这件事?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-03-30 19:42:46

在模块定义中初始化它们。

module MyModule
  # self here is MyModule
  @species = "frog"
  @color = "red polka-dotted"
  @log = []

  def self.log(msg)
    # self here is still MyModule, so the instance variables are still available
    @log << msg
  end
  def self.show_log
    puts @log.map { |m| "A #@color #@species says #{m.inspect}" }
  end
end

MyModule.log "I like cheese."
MyModule.log "There's no mop!"
MyModule.show_log #=> A red polka-dotted frog says "I like cheese."
                  #   A red polka-dotted frog says "There's no mop!"

这将在定义模块时设置实例变量。请记住,您可以随时重新打开模块,以添加更多实例变量和方法定义,或重新定义现有变量:

# continued from above...
module MyModule
  @verb = "shouts"
  def self.show_log
    puts @log.map { |m| "A #@color #@species #@verb #{m.inspect}" }
  end
end
MyModule.log "What's going on?"
MyModule.show_log #=> A red polka-dotted frog shouts "I like cheese."
                  #   A red polka-dotted frog shouts "There's no mop!"
                  #   A red polka-dotted frog shouts "What's going on?"
票数 112
EN

Stack Overflow用户

发布于 2009-03-30 18:03:15

您可以使用:

def init(var=0)
 @var = var
end

如果你不传递任何东西,它将默认为0。

如果你不想每次都调用它,你可以使用如下代码:

module AppConfiguration
   mattr_accessor :google_api_key
   self.google_api_key = "123456789"
...

end
票数 5
EN

Stack Overflow用户

发布于 2014-04-15 20:14:20

显然,在Ruby中初始化模块中的实例变量是不好的形式。(原因我不完全理解,但与实例化的顺序有关。)

似乎最好的做法是使用延迟初始化的访问器,如下所示:

module MyModule
  def var
    @var ||= 0 
  end
end

然后使用var作为@var的getter。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/698300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档