免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3411 | 回复: 2

动态定义ruby子类,和判断是否定义 [复制链接]

论坛徽章:
0
发表于 2012-03-06 11:12 |显示全部楼层
动态定义ruby子类,和判断是否定义




rubydymanic_programming
上篇有个标准的定义动态类变量
Ruby代码
  1. class MyClass   
  2.   class << self  
  3.     attr_accessor :my_constant  
  4.   end  
  5.   def my_method   
  6.     self.class.my_constant = "blah"  
  7.   end  
  8. end  
  9.   
  10. p MyClass.my_constant #=> nil   
  11. MyClass.new.my_method   
  12.   
  13. p MyClass.my_constant #=> "blah"  

  14. class MyClass
  15.   class << self
  16.     attr_accessor :my_constant
  17.   end
  18.   def my_method
  19.     self.class.my_constant = "blah"
  20.   end
  21. end

  22. p MyClass.my_constant #=> nil
  23. MyClass.new.my_method

  24. p MyClass.my_constant #=> "blah"
复制代码
如果类也动态定义,那么子类和module怎么定义进去的
Ruby代码
  1. dynamic_name = "TestEval2"  
  2.   
  3. Object.const_set(dynamic_name, Class.new{def method1() 42 end }})   
  4. dummy2 = eval("#{dynamic_name}")   
  5. puts "dummy2: #{dummy2}"  

  6. dynamic_name = "TestEval2"

  7. Object.const_set(dynamic_name, Class.new{def method1() 42 end }})
  8. dummy2 = eval("#{dynamic_name}")
  9. puts "dummy2: #{dummy2}"
复制代码
Ruby代码
  1. dynamic_name = "SubTestEval2"  
  2.   
  3. SubModule.const_set(dynamic_name, Class.new(TestEval2){def method1() 43 end })   
  4. dummy3 = eval("#{dynamic_name}")   
  5. puts "dummy3: #{dummy3}"  

  6. dynamic_name = "SubTestEval2"

  7. SubModule.const_set(dynamic_name, Class.new(TestEval2){def method1() 43 end })
  8. dummy3 = eval("#{dynamic_name}")
  9. puts "dummy3: #{dummy3}"
复制代码
判断动态类是否存在
Ruby代码
  1. def class_exists?(class_name)   
  2.   eval("defined?(#{class_name}) && #{class_name}.is_a?(Class)") == true  
  3. end  
  4.   
  5. class_name = "Blorp"  
  6. class_exists?(class_name)   
  7. => false  
  8.   
  9. class_name = "String"  
  10. class_exists?(class_name)   
  11. => true  

  12. def class_exists?(class_name)
  13.   eval("defined?(#{class_name}) && #{class_name}.is_a?(Class)") == true
  14. end

  15. class_name = "Blorp"
  16. class_exists?(class_name)
  17. => false

  18. class_name = "String"
  19. class_exists?(class_name)
  20. => true



  21. define_method定义的方法参数放到哪?
复制代码
Ruby代码  

论坛徽章:
0
发表于 2012-03-12 19:54 |显示全部楼层
谢谢分享

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2012-05-05 12:17 |显示全部楼层
现在算是明白了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP