因此,尽管我完全反对扩大现有类这样,有时(黑客rspec
)有必要做这样的事情类变量:可以访问一个模块中定义
module MyModule
module ClassMethods
def define_something(name)
@@names ||= []
@@names << name
end
end
def self.included(base)
base.extend ClassMethods
end
def all_names
@@names
end
end
class Example
include MyModule
define_something "one"
define_something "two"
end
Example.new.all_names
,然后它产生这个错误:
NameError: uninitialized class variable @@names in MyModule
而且据我所知,因为在写MyModule::ClassMethods
的时间 - 我们在示例中未类(不self.
)工作,所以我尝试:
module MyModule
module ClassMethods
def define_something(name)
@names ||= []
@names << name
end
end
def self.included(base)
base.extend ClassMethods
end
def all_names
@@names
end
end
class Example
include MyModule
define_something "one"
define_something "two"
end
Example.new.all_names
它不工作,要么,我终于结束了:
module MyModule
module ClassMethods
def define_something(name)
@names << name
end
end
def self.included(base)
base.instance_variable_set(:@names, [])
base.send(:define_method, :all_names) { base.instance_variable_get(:@names) }
base.extend ClassMethods
end
end
class Example
include MyModule
define_something "one"
define_something "two"
end
Example.new.all_names
有没有更好的方式来做到这一点?
'@@'和'@'是完全不同的。无论您处于类还是实例上下文中,都不能使用@ @访问“@@”变量,反之亦然。 – meagar