Question Créer des variables de module dans Ruby


Existe-t-il un moyen de créer une variable dans un module de Ruby qui se comporte comme une variable de classe? Ce que je veux dire par là, c'est qu'il serait possible d'y accéder sans initialiser une instance du module, mais cela peut être modifié (contrairement aux constantes des modules).


91
2018-04-16 23:48


origine


Réponses:


Ruby prend en charge nativement les variables de classe dans les modules, vous pouvez donc utiliser directement des variables de classe, et non des variables proxy ou pseudo-classes:

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'

139
2018-04-16 23:52



Si vous n'avez pas besoin de l'appeler depuis une instance, vous pouvez simplement utiliser une variable d'instance dans le corps du module.

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

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

La variable d'instance @param appartiendra alors au module SomeModule, qui est une instance du Module classe.


28
2018-04-17 03:02



vous pouvez définir une variable d'instance de classe dans le module.

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

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

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

20
2018-01-09 05:07



Vous pouvez également initialiser la valeur dans la définition du module:

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

p MyModule.my_variable

6
2018-03-04 12:40