【发布时间】:2011-08-07 02:55:44
【问题描述】:
有没有办法在 Ruby 中的模块中创建一个行为类似于类变量的变量?我的意思是,它可以在不初始化模块实例的情况下被访问,但它可以被更改(不像模块中的常量)。
【问题讨论】:
标签: ruby module class-variables
有没有办法在 Ruby 中的模块中创建一个行为类似于类变量的变量?我的意思是,它可以在不初始化模块实例的情况下被访问,但它可以被更改(不像模块中的常量)。
【问题讨论】:
标签: ruby module class-variables
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"
【讨论】:
defined?(@@foo) => "class variable"。
@ 实例变量中获得相同的结果。使用类变量是否有特定原因?感谢您的回复。
T.get 和 T::get?
您也可以在模块定义中初始化值:
module MyModule
class << self
attr_accessor :my_variable
end
self.my_variable = 2 + 2
end
p MyModule.my_variable
【讨论】:
您可以在模块中设置类实例变量。
module MyModule
class << self; attr_accessor :var; end
end
MyModule.var = 'this is saved at @var'
MyModule.var
=> "this is saved at @var"
【讨论】:
如果您不需要在实例中调用它,您可以简单地在模块主体中使用实例变量。
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 类的一个实例。
【讨论】: