浏览模式: 标准 | 列表

同样废话不多说,看例子:

Ruby代码
  1. class Test  
  2.   def initialize  
  3.     @foo = 'a'  
  4.     @bar = 'b'  
  5.   end  
  6.     
  7.   def foobar(a, b)  
  8.     puts @foo << a << @bar << b  
  9.   end  
  10. end  
  11. x = Object.const_get("Test").new  
  12. args = ['1''2']  
  13. x.method('foobar'.to_sym).call(*args)  

Ruby太简单了,我想解释也可以省了。

 

» 阅读全文

废话不多说,先看例子:

Ruby代码
  1. Object.module_eval("class Test1\nend")  
  2. x = Object.const_get("Test1".to_sym)  
  3. x.method(:attr_accessor).call("test1".to_sym)  
  4. x.method(:public).call("test1".to_sym)  
  5. x.method(:public).call("test1=".to_sym)  
  6. x.method(:attr_accessor).call("test2".to_sym)  
  7. x.method(:public).call("test2".to_sym)  
  8. x.method(:public).call("test2=".to_sym)  
  9. x.method(:attr_accessor).call("test3".to_sym)  
  10. x.method(:public).call("test3".to_sym)  
  11. x.method(:public).call("test3=".to_sym)  
  12. y = Test1.new  # also can use x.new  
  13. y.test1 = 'Hello'  
  14. y.test2 = 'Ruby'  
  15. y.test3 = 1.86  
  16. puts y.class  
  17. puts y.test1, y.test2, y.test3  

原理就是利用 module_eval 定义一个空类,然后利用 const_get 获取到该类的引用,最后利用反射机制调用 attr_accessor、public 等方法完成类的定义。

这样做有什么好处呢?好处是,只要我们知道类名及其属性名,就可以动态的创建一个类,这在反序列化未知类的对象时是非常有用的。

» 阅读全文