加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 03:13:09 所属栏目:百科 来源:网络整理
导读:我想构建一个函数“create”,它具有以下功能: zoo=[]zoo create(:dog,4)zoo[0].class #Dog classmyDog=zoo[0].new("foobar") #instance of DogmyDog.legs #4 legs because my dog is a Dogzoo[0].class.legs #4zoo[0].class.superclass #Animalzoo[0].class
我想构建一个函数“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

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

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读