ruby 反射
反射主要是用于动态地调用一些例实例或类型的方法。在java与C#等静态语言中是十分普遍的。以下先看一下最简单的例子:
obj="Hello World"
puts obj.methods #输入对象可以使用的方法
puts obj.class #输入对像的类型
puts obj.class.superclass #输入对象的父类
第一行创建了一个字符串对象,但我们刚接触Ruby这个语言,我们并不知道这种类型的对象有什么方法可以为我们服务。所以我们调用这个对象的mehtods方法(每个一对象都有这个方法)。这个方法所回一个数组,数组的内容是这个对象的所有能调用的方法。因些运行这个程序,屏幕会输出以下内容:
select
[]=
inspect
<<
each_byte
clone
......
...
..
怎么样,这功能不错吧?还有更精彩的内容在后头呢。
Ruby不但支持类型的方法重载,还支持对实例的方法重载
class MyClass
def MyClass.static_method1
puts "this is static method1"
end
def instance_method1
puts "this is instance method1"
end
end
obj=MyClass.new
#下面这三个重写了实例的instance_method1方法
def obj.instance_method1 #如果没有这三行,下面的singleton_methods方法将会为空
puts "overrided instance_method1" #
end #
puts obj.instance_method1 # =>>输出overrided instance_method1
puts "=============="
puts obj.singleton_methods
每一个对象还有一个singleton_methods方法(上面的代码的最后一行调用了这个方法),可以列出一个实例被重写了的方法(居然能单独重写实例的方法,会不会有点灵活过头了?-_-!)。
我们还可以用字符串指定我们要调用哪个方法,下面是一个例子:
class MyClass
def MyClass.static_method1
puts "this is static method1"
end
def instance_method1
puts "this is instance method1"
end
def printf *a
puts "printf方法输出#{a}"
end
end
obj=MyClass.new
def obj.instance_method1
puts "overrided instance_method1"
end
m = obj.method 'instance_method1' #得到一个具体的方法
m.call #调用这个具体的方法
m = obj.method 'printf' #得到一个具体的方法
m.call 'aa','bb' #调用这个具体的方法(带参数)
最后,用一个简单有趣的例子结束这遍文章:
class MyClass
attr_accessor 'aa'
attr_accessor :bb
attr_accessor :cc
attr_accessor :dd
attr_accessor :ee
attr_accessor :ff
def initialize
@aa='属性AA'
@bb='属性bb'
@cc='属性cc'
@dd='属性dd'
@ee='属性ee'
@ff='属性ff'
end
def ab
puts "asf"
end
end
obj=MyClass.new
puts obj.aa
puts "本对象有以下方法:"
my_super = obj.class.superclass
puts obj.methods-my_super.methods
s=gets
while true do
puts "你可以输入aa,bb,cc..等属性,反射会帮你调用对像的这些方法:"
puts "输入‘exit’可以退出。"
s=gets
s=s.gsub(/n/,'') #要把输入的最后一个换行符替换掉,否则找不到这个方法
if s=="exit"
break
end
puts "你的调用结果是:"
puts obj.method('ab').call
puts "================="
end