Rubyでモジュール変数を作成する


111

Rubyのモジュールでクラス変数と同様に動作する変数を作成する方法はありますか?つまり、モジュールのインスタンスを初期化しなくてもアクセスできますが、(モジュールの定数とは異なり)変更できます。

回答:


158

Rubyはモジュール内のクラス変数をネイティブにサポートしているため、一部のプロキシ変数や疑似クラス変数ではなく、クラス変数を直接使用できます。

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実際、私は「クラス変数」という用語は誤解を招くと思っていました。クラスはモジュールの特殊なケースであり、クラス変数はモジュールで定義できます。それらはモジュール変数と呼ばれるべきです。
佐和

3
@sawa:少し誤解を招くかもしれませんが、Ruby自体が使用しているものですdefined?(@@foo) => "class variable"
Andrew Grimm

1
または、静的フィールドと呼ぶこともできます。彼らはそうであるようです。
Peter Ajtai、2012年

@coreywardちょっと私の間違い。なぜ2つの「@@」クラス変数が必要なのですか?特にクラスがクラス変数を使用するように拡張されている場合、それはコードのにおいと見なされませんか?私はこれをテストしていて、単一の@インスタンス変数から同じ結果が得られることに気付きました。クラス変数を使用する特定の理由はありますか?返信いただきありがとうございます。
fabbb 2014年

2
なぜ最後に別の呼び出し:T.getT::get
intrixius 2014

31

インスタンス内から呼び出す必要がない場合は、モジュール本体内でインスタンス変数を使用できます。

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

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

@paramその後、インスタンス変数はSomeModuleModuleクラスのインスタンスであるモジュールに属します。


23

モジュールにクラスインスタンス変数を設定できます。

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

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

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

+1。ただし、クラスインスタンス変数はクラス変数とは異なることを強調します。
Andrew Grimm

4
ええ、完全に...とところで..私はいくつかの例を見て、この記事をご確認ください..あなたがそれらを使用する場合、いくつかの予期せぬ事が起こる...すべてのクラス変数を使用することをお勧めいけないoreillynet.com/ruby/blog/2007/01/...
オーランド

8

モジュール定義内で値を初期化することもできます:

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

p MyModule.my_variable
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.