【问题标题】:create class dynamically, with inheritance and particular accessors使用继承和特定访问器动态创建类
【发布时间】:2011-07-22 19:41:10
【问题描述】:

我想构建一个“create”函数,它为我提供以下功能:

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

"create(:dog,4)" 生成一个继承 Animal 等的新类 Dog

你能帮忙解决这个看似简单的元编程问题吗?

【问题讨论】:

    标签: ruby metaprogramming


    【解决方案1】:
    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
    

    【讨论】:

    • 完美!我被困在 Class.new 上。我不知道 Class.new(Animal)。太可怕了!
    猜你喜欢
    • 2017-09-25
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 2015-12-30
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多