Ruby中的语言特性—反射技术

来源:互联网 发布:java 自定义审批流程 编辑:程序博客网 时间:2024/06/05 01:18
java与c#等高级语语言都支持反射技术,Ruby也不例外。
学习一种语言必须了解它的一些特性,在上一篇《开发软件常用到的几个最基本技能(RUBY 语言描述)。》中也简单地提到Ruby的一些语言物性,在这里想单独说明一下Ruby中的常用的一些技巧。而反射技术在其它多种与言中也是广泛地使用的。因此在这里先说明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
= obj.method 'instance_method1' #得到一个具体的方法
m.call #调用这个具体的方法
= 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
原创粉丝点击