【发布时间】:2020-05-28 21:50:05
【问题描述】:
我正在学习 Ruby 以及类变量和实例变量之间的区别。
我正在编写一段代码,其中有(很多)类继承了其他类。
class childImporter < parentImporter
def self.infos
parentImporter.infos.merge({
:name=> 'My Importer',
})
end
def self.schema
schema = parentImporter.schema.deep_merge({
'selectors' => {
'track' => {
'artist'=> {'path'=>{'default'=>'//creator'}},
'title'=> {'path'=>{'default'=>['//name'}},
}
}
})
@@schema = schema
end
def initialize(params = {})
super(params,childImporter.schema)
end
end
我有两个类变量:infos(进口商信息)和schema(json 模式)。
我需要它们能够将它们放到实例之外(这就是它们是类变量的原因),并成为它们父值的扩展(这就是我deep_merge它们的原因),和
我的示例确实有效,但我想知道是否有办法不对类名 childImporter 和 parentImporter 进行硬编码,而是使用对父类的引用,例如具有
schema = PARENTCLASS.schema.deep_merge({
而不是
schema = parentImporter.schema.deep_merge({
或
super(params,THISCLASS.schema)
而不是
super(params,childImporter.schema).
有没有办法做到这一点?
目前,如果我尝试
超级(参数,@@schema)
我明白了
NameError:childImporter 中未初始化的类变量@@schema
谢谢
【问题讨论】:
-
Ruby 中的类名必须以大写字母开头。您的
{'default'=>['//name'}中有语法错误。除此之外,您可能希望将您的代码转换为 minimal reproducible example,以便我们可以实际运行它。
标签: ruby instance-variables class-variables