Crea variabili di modulo in Ruby


111

C'è un modo per creare una variabile in un modulo in Ruby che si comporti in modo simile a una variabile di classe? Ciò che intendo con questo è che sarebbe possibile accedervi senza inizializzare un'istanza del modulo, ma può essere modificato (a differenza delle costanti nei moduli).

Risposte:


158

Ruby supporta nativamente le variabili di classe nei moduli, quindi puoi usare direttamente le variabili di classe e non alcune variabili proxy o pseudo-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
+1 In realtà, ho pensato che il termine "variabile di classe" sia fuorviante. Le classi sono casi speciali di moduli e le variabili di classe sono definibili sui moduli. Dovrebbero essere chiamate variabili di modulo.
sawa

3
@sawa: E 'un po' fuorviante, ma è quello che utilizza Rubino stessa: defined?(@@foo) => "class variable".
Andrew Grimm

1
Oppure potrebbero essere chiamati campi statici. Sembra che sia quello che sono.
Peter Ajtai,

@coreyward Hey errore mio. Perché la necessità di due variabili di classe "@@"? Non è considerato un odore di codice, soprattutto se la classe viene estesa per utilizzare le variabili di classe? Lo stavo testando e mi sono reso conto che potevo ottenere lo stesso risultato da una singola @variabile di istanza. C'è un motivo specifico per utilizzare le variabili di classe? Grazie per la risposta.
fabbb

2
perché le diverse chiamate alla fine: T.gete T::get?
intrixius

31

Se non è necessario chiamarlo dall'interno di un'istanza, è possibile utilizzare semplicemente una variabile di istanza all'interno del corpo del modulo.

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 variabile di istanza @paramapparterrà quindi al modulo SomeModule, che è un'istanza della Moduleclasse.


23

puoi impostare una variabile di istanza di classe nel modulo.

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

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

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

+1, ma sottolineerò solo che le variabili di istanza di classe sono diverse dalle variabili di classe.
Andrew Grimm

4
sì totalmente .. e btw .. non consiglio affatto di usare le variabili di classe .. alcune cose inaspettate accadono quando le usi .. controlla questo articolo per vedere alcuni esempi oreillynet.com/ruby/blog/2007/01/…
Orlando

8

È inoltre possibile inizializzare il valore all'interno della definizione del modulo:

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

p MyModule.my_variable
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.