121

有没有办法在 Ruby 的模块中创建一个行为类似于类变量的变量?我的意思是,它可以在不初始化模块实例的情况下被访问,但它可以被更改(与模块中的常量不同)。

4

4 回答 4

173

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"
于 2011-04-16T23:52:25.513 回答
32

如果您不需要从实例中调用它,您可以简单地在模块主体中使用实例变量。

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将属于模块SomeModule,它是Module类的一个实例。

于 2011-04-17T03:02:33.980 回答
25

您可以在模块中设置类实例变量。

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

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

MyModule.var    
=> "this is saved at @var"
于 2012-01-09T05:07:35.090 回答
8

您还可以在模块定义中初始化值:

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

p MyModule.my_variable
于 2016-03-04T12:40:46.673 回答