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


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

4 92

4 ответа:

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

module T
  @@foo = 'bar'

  def self.set(x)
    @@foo = x
  end

  def self.get
    @@foo
  end
end

p T.get         #=> 'bar'
T.set('fubar')
p T::get        #=> 'fubar'

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

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 класса.

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

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

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

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

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

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

p MyModule.my_variable