2011-07-22 6 views
5

で私は、「作成」機能を構築したいのですが、動的にクラスを作成します。私に次のような機能を与えることを継承し、特定のアクセサ

zoo=[] 
zoo << create(:dog,4) 
zoo[0].class #Dog class 
myDog=zoo[0].new("foobar") #instance of Dog 
myDog.legs #4 legs because my dog is a Dog 
zoo[0].class.legs #4 
zoo[0].class.superclass #Animal 
zoo[0].class.superclass.legs #whatever, but they have legs 

は、「作成(:犬を、4)」新しいクラスを作成します動物を継承する犬

あなたはこの明らかに単純なメタプログラミングの質問について助けてくれますか?

答えて

5
class Animal 
    def self.legs=(legs) 
    @legs = legs 
    end 

    def self.legs 
    @legs 
    end 

    def legs 
    self.class.legs 
    end 
end 

def create(sym, legs) 
    klass = Object.const_set(sym.to_s.capitalize, Class.new(Animal)) 
    klass.legs = legs 
    klass 
end 

kdog = create(:dog, 4) 
kalien = create(:alien, 3) 

dog = kdog.new 
alien = kalien.new 

puts kdog 
puts kdog.class 
puts kdog.superclass 
puts kdog.legs 

puts dog.class 
puts dog.legs 

puts "------" 

puts kalien 
puts kalien.class 
puts kalien.superclass 
puts kalien.legs 

puts alien.class 
puts alien.legs 

出力:

Dog 
Class 
Animal 
4 
Dog 
4 
------ 
Alien 
Class 
Animal 
3 
Alien 
3 
+0

完璧!私はClass.newにこだわっていた。私はClass.new(動物)を知らなかった。恐ろしい! – JCLL

関連する問題