117 votes

Créer des variables de module en Ruby

Y a-t-il un moyen de créer une variable dans un module en Ruby qui se comporterait de manière similaire à une variable de classe ? Ce que je veux dire par là, c'est qu'elle pourrait être accédée sans initialiser une instance du module, mais elle peut être modifiée (contrairement aux constantes dans les modules).

166voto

coreyward Points 26109

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

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"

5 votes

+1 En fait, j'ai pensé que le terme 'variable de classe' est trompeur. Les classes sont des cas spéciaux de modules, et les variables de classe sont définissables sur les modules. Elles devraient être appelées variables de module.

3 votes

@sawa: C'est un peu trompeur, mais c'est ce que Ruby lui-même utilise: defined?(@@foo) => "variable de classe".

1 votes

Ou ils pourraient être appelés champs statiques. Semble que c'est ce qu'ils sont.

32voto

sawa Points 62592

Si vous n'avez pas besoin de l'appeler à partir d'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.

25voto

Orlando Points 3184

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

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

MyModule.var = 'ceci est enregistré dans @var'

MyModule.var    
=> "ceci est enregistré dans @var"

0 votes

+1, mais je vais simplement souligner que les variables d'instance de classe sont différentes des variables de classe.

4 votes

Oui totalement.. et au fait.. je ne recommande pas du tout d'utiliser des variables de classe.. des choses inattendues se produisent lorsque vous les utilisez.. consultez cet article pour voir quelques exemples oreillynet.com/ruby/blog/2007/01/…

10voto

Nakilon Points 11635

Vous pouvez également initialiser la valeur à l'intérieur de la définition du module :

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

p MyModule.my_variable

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X