在Ruby中创建模块变量

Mar*_*ski 107 ruby module class-variables

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

cor*_*ard 155

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"
Run Code Online (Sandbox Code Playgroud)

  • +1实际上,我一直认为"类变量"一词具有误导性.类是模块的特例,类变量可以在模块上定义.它们应该被称为模块变量. (4认同)
  • @sawa:这有点误导,但这是Ruby本身使用的:`定义?(@@ foo)=>"类变量"`. (3认同)
  • @coreyward 嘿我的错误。为什么需要两个“@@”类变量?难道它不被认为是代码味道吗,特别是如果类被扩展为使用类变量?我正在测试这个,我意识到我可以从单个“@”实例变量得到相同的结果。使用类变量有什么具体原因吗?谢谢回复。 (2认同)
  • 为什么最后的不同调用:`T.get`和`T :: get`? (2认同)

saw*_*awa 30

如果您不需要在实例中调用它,则只需在模块体中使用实例变量即可.

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

SomeModule.param
# => nil
SomeModule.param = 1
SomeModule.param
# => 1
Run Code Online (Sandbox Code Playgroud)

然后,实例变量@param将属于模块SomeModule,该模块是Module类的实例.


Orl*_*ndo 22

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

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

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

MyModule.var    
=> "this is saved at @var"
Run Code Online (Sandbox Code Playgroud)

  • 是的完全..而顺便说一句..我根本不建议使用类变量..当你使用它们时会发生一些意想不到的事情..查看这篇文章看一些例子http://www.oreillynet.com/ruby/blog/2007 /01/nubygems_dont_use_class_variab_1.html (4认同)
  • +1,但我只是强调类实例变量与类变量不同。 (3认同)

Nak*_*lon 8

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

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

p MyModule.my_variable
Run Code Online (Sandbox Code Playgroud)