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

IRB:

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

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 は 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 に答える