在Ruby中创建模块变量


111

有没有什么办法可以在Ruby中的模块中创建类似于类变量的变量?我的意思是无需初始化模块实例即可访问它,但是可以更改它(与模块中的常量不同)。

Answers:


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实际上,我一直在思考“类变量”一词具有误导性。类是模块的特例,类变量是在模块上定义的。它们应称为模块变量。
sawa

3
@sawa:有点误导,但这是Ruby本身使用的:defined?(@@foo) => "class variable"
安德鲁·格林

1
或者它们可以称为静态字段。似乎就是他们。
彼得·阿杰泰

@coreyward嘿,我的错。为什么需要两个“ @@”类变量?它不是一种代码味道吗,特别是如果扩展了类以使用类变量时?我对此进行了测试,我意识到我可以从单个@实例变量中获得相同的结果。使用类变量是否有特定原因?谢谢回复。
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然后,该实例变量将属于属于该类SomeModule实例的模块Module


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,但我只强调类实例变量与类变量不同。
安德鲁·格林

4
是啊..完全和BTW ..我不推荐使用类变量所有..一些意想不到的事情,当你使用它们偏偏..查看这篇文章,看到一些例子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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.