web-dev-qa-db-fra.com

Créer des variables de module dans Ruby

Est-il possible de créer une variable dans un module dans Ruby qui se comporterait de la même manière qu'une variable de classe? Ce que je veux dire par là, c'est qu'elle serait accessible sans initialiser une instance de le module, mais il peut être modifié (contrairement aux constantes dans les modules).

104
Mark Szymanski

Ruby supporte nativement les variables de classe dans les modules, vous pouvez donc utiliser les variables de classe directement, et non certaines variables proxy ou pseudo-classes:

module Site
  @@name = "StackOverflow"

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

  def self.name
    @@name
  end
end

Site.name            # => "StackOverflow"
Site.setName("Test")
Site.name            # => "Test"
151
coreyward

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 de la classe Module.

29
sawa

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"
22
Orlando

Vous pouvez également initialiser une 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
8
Nakilon