首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > Ruby Rails >

ruby 反照

2012-09-01 
ruby反射反射主要是用于动态地调用一些例实例或类型的方法。在java与C#等静态语言中是十分普遍的。以下先看

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

热点排行