我正在学习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)。
有没有办法做到这一点?
当前,如果我尝试的话
super(params,@@ schema)
我知道
NameError:childImporter中未初始化的类变量@@ schema
谢谢
这可能有帮助-您可以像这样访问类和超类:
class Parent
end
class Child < Parent
def self.print_classes
p itself
p superclass
end
end
Child.print_classes
将打印
儿童
父母
类从其父类继承类方法和实例方法。在这两种变体中,您可以调用super
来引用父级的实现:
class ParentImporter
def self.infos
{ name: 'Parent Importer', type: 'Importer' }
end
end
class ChildImporter < ParentImporter
def self.infos
super.merge(name: 'Child Importer')
end
end
ParentImporter.infos
#=> {:name=>"Parent Importer", :type=>"Importer"}
ChildImporter.infos
#=> {:name=>"Child Importer", :type=>"Importer"}
此外,您可能希望memoize合并值,因此不必每次调用该方法时都计算它:
class ChildImporter < ParentImporter
def self.infos
@infos ||= super.merge(name: 'Child Importer')
end
end
[@infos
是所谓的类实例变量,即类对象范围内的实例变量。
要从其实例之一引用该类,可以使用self.class
,例如:
def initialize(params = {})
super(params, self.class.schema)
end
后记:我根本不会使用@@
类变量。只需调用您的类方法即可。