Создание переменных модуля в Ruby

Есть ли способ создать переменную в модуле в Ruby, который будет вести себя аналогично переменной класса? Я имею в виду, что к нему можно будет получить доступ без инициализации экземпляра модуля, но его можно изменить (в отличие от констант в модулях).

Ответ 1

Ruby изначально поддерживает переменные класса в модулях, поэтому вы можете использовать переменные класса напрямую, а не некоторые прокси-переменные или псевдоклассные переменные:

module Site
  @@name = "Qaru"

  def self.setName(value)
    @@name = value
  end

  def self.name
    @@name
  end
end

Site.name            # => "Qaru"
Site.setName("Test")
Site.name            # => "Test"

Ответ 2

Если вам не нужно вызывать его из экземпляра, вы можете просто использовать переменную экземпляра в теле модуля.

module SomeModule
  module_function
  def param; @param end
  def param= v; @param = v end
end

SomeModule.param
# => nil
SomeModule.param = 1
SomeModule.param
# => 1

Затем переменная экземпляра @param будет принадлежать модулю SomeModule, который является экземпляром класса Module.

Ответ 3

вы можете установить переменную экземпляра класса в модуле.

module MyModule
   class << self; attr_accessor :var; end
end

MyModule.var = 'this is saved at @var'

MyModule.var    
=> "this is saved at @var"

Ответ 4

Вы также можете инициализировать значение в определении модуля:

module MyModule
  class << self
    attr_accessor :my_variable
  end
  self.my_variable = 2 + 2
end

p MyModule.my_variable