Reflection 也叫反射。
在编程语言中指在程序执行时,取出程序的信息, 或者改变程序信息。
Ruby 的反射功能包括:从对象查看类,查看类的基类,以及查看全局变量、局部变量等等,非常丰富。
下面一个例子: 查看数值 5 这个对象,所对应的对象的类型,以及该对象的父类情况。
touch reflection.rb vim reflection.rb c = 5.class while c s = c.superclass if s print c," < " else print c end c = s end puts $ ruby reflection.rb Fixnum < Integer < Numeric < Object < BasicObject
可以数值类 Fixnum 依次继承的父类,直到 BasicObject。
同样我们查看一下字符串的类继承情况。简单修改一下程序,执行结果如下:
c = "Hello ruby".class String < Object < BasicObject
更进一步的,我们使用 ObjectSpace,遍历所有的类。
下面的例子,结果显示了一个更加完全的类层次:
touch reflection.rb vim objectspace.rb c = 5.class level = 1 while c print "#{level}: #{c}" ObjectSpace.each_object(Class) do |ob| print " #{ob} " if c.superclass == ob.superclass && c != ob end puts c = c.superclass level += 1 end $ ruby objectspace.rb 1: Fixnum Bignum 2: Integer Complex Rational Float 3: Numeric Fiber Mutex ThreadGroup RubyVM::InstructionSequence Thread RubyVM::Env RubyVM Enumerator::Yielder Proc IO Enumerator::Generator Enumerator Binding UnboundMethod Method Process::Status Random Time Dir File::Stat ARGF.class Range MatchData Regexp String Encoding Struct Hash Array Exception Symbol FalseClass TrueClass Data NilClass Module 4: Object 5: BasicObject
下面列举了常用的 Ruby 反射功能:
Module#instance_methods 列出类/模块的方法 Object#methods 列出对象的方法 Object#instance_variables 列出对象的实例变量 global_variables 列出全局变量 local_variables 列出局部变量 Module#constants 列出类/模块的常量 Module#define_method 定义类方法 Module#remove_method 删除类方法 Module#undef_method 解除类方法定义 Module#alias_method 给类方法起别名 Class#superclass 获取父类 Module#include_modules 获取包含的类 method_missing 给未定义的方法设置钩子处理 eval 解释字符串 Object#instance_eval 在对象的上下文中解释字符串 Module#class_eval 在类的上下文中解释字符串 defined? 检查方法是否有定义
在 Ruby meta-programming (元编程)中,对反射机制加以运用,可以实现很多特异方法。
如:Delegator(委托或代理)方法。
2013-05-07