在 Ruby 中创建模块变量

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

105052 次浏览

Ruby natively supports class variables in modules, so you can use class variables directly, and not some proxy or pseudo-class-variables:

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"

如果不需要从实例中调用它,只需在模块主体中使用一个实例变量。

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类的一个实例。

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

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


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


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

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

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


p MyModule.my_variable