Ruby'de modül değişkenleri oluşturun


111

Ruby'de bir modülde bir sınıf değişkenine benzer davranan bir değişken yaratmanın herhangi bir yolu var mı? Bununla demek istediğim, modülün bir örneğini başlatmadan erişilebileceğidir, ancak değiştirilebilir (modüllerdeki sabitlerin aksine).

Yanıtlar:


158

Ruby, modüllerdeki sınıf değişkenlerini yerel olarak destekler, böylece sınıf değişkenlerini doğrudan kullanabilirsiniz, bazı proxy veya sözde sınıf değişkenlerini kullanamazsınız:

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 Aslında, 'sınıf değişkeni' teriminin yanıltıcı olduğunu düşünüyordum. Sınıflar, modüllerin özel durumlarıdır ve sınıf değişkenleri modüller üzerinde tanımlanabilir. Modül değişkenleri olarak adlandırılmaları gerekir.
sawa

3
@sawa: Biraz yanıltıcı, ama Ruby kendisi kullanır ne: defined?(@@foo) => "class variable".
Andrew Grimm

1
Veya statik alanlar olarak adlandırılabilirler. Öyle görünüyorlar.
Peter Ajtai

@coreyward Hey benim hatam. Neden iki '@@' sınıf değişkenine ihtiyaç var? Özellikle sınıf, sınıf değişkenlerini kullanacak şekilde genişletilirse, bir kod kokusu olarak görülmez mi? Bunu test ediyordum ve aynı sonucu tek bir @örnek değişkeninden alabileceğimi fark ettim . Sınıf değişkenlerini kullanmanın belirli bir nedeni var mı? Cevap için teşekkürler.
fabbb

2
neden sonunda farklı aramalar: T.getve T::get?
intrixius

31

Bir örnek içinden çağırmanız gerekmiyorsa, modül gövdesi içinde bir örnek değişkeni kullanabilirsiniz.

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

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

Örnek değişkeni @paramdaha sonra sınıfın SomeModulebir örneği olan modüle ait olacaktır Module.


23

modülde bir sınıf örneği değişkeni ayarlayabilirsiniz.

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

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

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

+1, ancak sınıf örneği değişkenlerinin sınıf değişkenlerinden farklı olduğunu vurgulayacağım.
Andrew Grimm

4
evet tamamen .. ve btw .. sınıf değişkenlerini hiç kullanmanızı önermiyorum .. onları kullandığınızda bazı beklenmedik şeyler oluyor .. bazı örnekleri görmek için bu makaleye bakın oreillynet.com/ruby/blog/2007/01/…
Orlando

8

Modül tanımı içinde değeri de başlatabilirsiniz:

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

p MyModule.my_variable
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.