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