使用继承和特定访问器动态创建类

发布于 2024-11-25 10:58:51 字数 395 浏览 1 评论 0原文

我想构建一个函数“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

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

I'd like to build a function "create" that gives me the following capabilities :

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)" produces a new class Dog that inherits Animal etc

Can you help about this apparently simple metaprogramming question ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

冷血 2024-12-02 10:58:51
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 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

Output:

Dog
Class
Animal
4
Dog
4
------
Alien
Class
Animal
3
Alien
3
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文