Ruby中的语言特性—反射技术
来源:互联网 发布:java 自定义审批流程 编辑:程序博客网 时间:2024/06/05 01:18
java与c#等高级语语言都支持反射技术,Ruby也不例外。
学习一种语言必须了解它的一些特性,在上一篇《开发软件常用到的几个最基本技能(RUBY 语言描述)。》中也简单地提到Ruby的一些语言物性,在这里想单独说明一下Ruby中的常用的一些技巧。而反射技术在其它多种与言中也是广泛地使用的。因此在这里先说明Ruby中如何利用反射技术。
反射主要是用于动态地调用一些例实例或类型的方法。在java与C#等静态语言中是十分普遍的。以下先看一下最简单的例子:
学习一种语言必须了解它的一些特性,在上一篇《开发软件常用到的几个最基本技能(RUBY 语言描述)。》中也简单地提到Ruby的一些语言物性,在这里想单独说明一下Ruby中的常用的一些技巧。而反射技术在其它多种与言中也是广泛地使用的。因此在这里先说明Ruby中如何利用反射技术。
反射主要是用于动态地调用一些例实例或类型的方法。在java与C#等静态语言中是十分普遍的。以下先看一下最简单的例子:
obj="Hello World"
puts obj.methods #输入对象可以使用的方法
puts obj.class #输入对像的类型
puts obj.class.superclass #输入对象的父类
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
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' #调用这个具体的方法(带参数)
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
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
- Ruby中的语言特性—反射技术
- .Net 中的反射(反射特性)
- .Net 中的反射(反射特性)
- .Net 中的反射(反射特性) - Part.3
- .Net 中的反射(反射特性) - Part.3
- .Net 中的反射(反射特性) - Part.3
- .Net 中的反射(反射特性) - Part.3
- .Net 中的反射(反射特性) - Part.3
- .Net 中的反射(反射特性) - Part.3
- .Net 中的反射(反射特性) - Part.3
- C#中的特性和反射
- java中的反射技术
- Java中的反射技术
- java中的反射技术
- Java中的反射技术
- 在Ruby中的多线程技术
- Ruby中的反射(Reflection)應用實例
- Ruby:编程语言中的精华
- 用JDK6中新特性快速把JLabel做成超链接
- Google搜索技巧
- Tomcat6 如何登录Tomcat Manager
- メンセツ
- 企业架构观点:什么最适合您的组织?
- Ruby中的语言特性—反射技术
- 数据库性能调优1
- 多线程多进程数据库访问应注意问题
- javascript小技巧
- IC资料下载网
- cookie和session的区别
- java 继承类 变量、静态变量、构造函数执行顺序
- 在VB中使用文字朗读引擎(TTS)技术
- 使用 JFreeChart来创建基于web的图表