How can I initialize a module's instance variables in Ruby? How can I initialize a module's instance variables in Ruby? ruby ruby

How can I initialize a module's instance variables in Ruby?


Initialize them in the module definition.

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}" }  endendMyModule.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!"

This will set the instance variables when the module is defined. Remember, you can alwasys reopen the module later to add more instance variables and method definitions,or to redefine existing ones:

# continued from above...module MyModule  @verb = "shouts"  def self.show_log    puts @log.map { |m| "A #@color #@species #@verb #{m.inspect}" }  endendMyModule.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?"


You can use:

def init(var=0) @var = varend

And it will default to 0 if you don't pass anything.

If you don't want to have to call it everytime, you could use something like this:

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


i answered a similar question, you can set class instance variables doing this

module MyModule  class << self; attr_accessor :var; endendMyModule.var=> nilMyModule.var = 'this is saved at @var'=> "this is saved at @var"MyModule.var    => "this is saved at @var"