Ruby动态实例化类

Ruby动态实例化类,ruby,Ruby,如何在静态方法中引用类 class Car def self.new_from_xml(xml) instance = self.class.new #do some stuff with xml instance end end class Mercedes < Car end class Porsche < Car end 等级车 def self.new_from_xml(xml) 实例=self.class.new #使用xml做一些事情

如何在静态方法中引用类

class Car
  def self.new_from_xml(xml)
    instance = self.class.new
    #do some stuff with xml
    instance
  end
end

class Mercedes < Car
end

class Porsche < Car
end
等级车
def self.new_from_xml(xml)
实例=self.class.new
#使用xml做一些事情
实例
结束
结束
奔驰级轿车
结束
保时捷级<轿车
结束
内部评级:

Mercedes.new_from_xml(somedata)#输出为#,应为#
Porsche.new_from_xml(somedata)#输出为#,应为#

既然您已经在一个类方法中,您应该使用
self.new
(或者简单地使用@tokland编写的
new
)而不是
self.class.new

class Car
   def self.new_from_xml(xml)
       instance = new
       #do some stuff with xml
   end
end

class Mercedes < Car
end

class Porsche < Car
end

p Mercedes.new_from_xml(nil) #=> #<Mercedes:0x007f042d0db208>
p Porsche.new_from_xml(nil) #=> #<Porsche:0x007f042d0db118>
使用
def self.new_from_xml
就像您在声明
def Car.new_from_xml
,这是
Car
对象的一个方法(它是
类的一个实例);因此,在
new\u-from\u-xml
self
中,与
Car
一致,而不是

instance=self.class.new
只要写

instance = new
这是为什么?

首先,您必须了解您正在调用一个类方法,因此您已经处于类级别。.new方法是类方法,因此可以直接调用它,而无需调用self.class.new

为什么self.class.new返回类?

因为Car类的类是class(我知道,听起来很奇怪),因为Ruby中的类是class的实例

这实际上是一个相当深刻的概念,我建议你多读一些。我读过的一本很好的参考书是Paolo Perrotta的《元编程Ruby》(ISBN-10:1934356476)[1]


  • 或者干脆
    新建
    。此外,您还可以修改问题的单面样式(空格、缩进):-)谢谢。成功了。为什么self.class引用类?这里的逻辑是什么?
    instance=self.class.new
    
    instance = new