ruby:如何避免对类名进行硬编码?

问题描述 投票:0回答:1

我正在学习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

谢谢

ruby instance-variables class-variables
1个回答
0
投票

这可能有帮助-您可以像这样访问类和超类:

 class Parent

 end

 class Child < Parent

   def self.print_classes
     p itself
     p superclass
   end
  end

 Child.print_classes

将打印

儿童

父母


0
投票

类从其父类继承类方法和实例方法。在这两种变体中,您可以调用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

后记:我根本不会使用@@类变量。只需调用您的类方法即可。

© www.soinside.com 2019 - 2024. All rights reserved.