2

如何在静态方法中引用类?

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

内部审查委员会:

Mercedes.new_from_xml(somedata) # Output is #<Class:...>, should be #<Mercedes:...>
Porsche.new_from_xml(somedata)  # Output is #<Class:...>, should be #<Porsche:...>
4

2 回答 2

4

代替

instance=self.class.new

写吧

instance = new

为什么是这样?

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

为什么 self.class.new 会返回 Class?

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

这实际上是一个非常深刻的概念,我建议您阅读更多有关它的内容。我读过的一本很好的参考书是 Paolo Perrotta 所著的 Metaprogramming Ruby (ISBN-10: 1934356476) [1] 一书。

  1. http://www.amazon.com/Metaprogramming-Ruby-Program-Like-Pros/dp/1934356476
于 2013-04-03T12:26:04.413 回答
2

由于您已经在一个类方法中,您应该使用self.new(或简单地new,如@tokland 所写)而不是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>

从评论到这个答案:为什么 self.class 引用类?这里的逻辑是什么?

在类块内self引用您正在编辑的类:

class Car
  puts self #=> writes Car
end

使用def self.new_from_xml它就像你在声明def Car.new_from_xml,那是Car对象的一个​​方法(它是 的一个实例Class);所以里面new_from_xml self不谋而合Car

于 2013-04-03T12:20:04.270 回答