• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >ruby > Ruby中的反射(Reflection)应用实例

Ruby中的反射(Reflection)应用实例

作者:junjie 字体:[增加 减小] 来源:互联网

junjie 通过本文主要向大家介绍了ruby实例,ruby 实例变量,ruby应用,ruby,ruby rose等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

在Java语言中,提供了发射机制,通过发射机制可以通过字符串构造出这个对象,可以获取对象的所有方法(包括私有方法),可以调用私有方法,可以更改成员变量的值(包括私有的成员变量)。
Ruby也是面向对象的高级语言,当然也提供了反射机制,今天我们讨论通过类名称构造类对象的功能。

一、通过类名称构造类对象

我们先看普通的构造:

    #the class name, later we will use it to create the corresponding object

    CLASS_NAME_OF_WOOD = "ModuleA::Wood"

    CLASS_NAME_OF_WOODDESK = "ModuleA::WoodDesk"

    CLASS_NAME_OF_WOODCHAIR = "ModuleA::WoodChair"


    class Wood

        def initialize

            @desc = "I am a primal wood"

        end


        def say

            puts @desc

        end

    end


    class WoodDesk < Wood

        def initialize

            @desc = "I am a desk made of wood"

        end


        def say_private

            puts "actually, i have some bug but no public"

        end


        public :say

        private :say_private


    end


    class WoodChair < Wood

        def initialize

            @desc = "I am a chair made of wood"

        end


        def say_private

            puts "I Want get married with a WoodDesk..."

        end


        def smile

            puts "ha hah hah haha ...."

        end


        public :say

        private :say_private, :smile

    end

end
</div>

定义了一个基础类Wood,有两个子类:WoodDesk, WoodChair,子类有分别有一个私有方法 say_private。
我们new出对象来执行:

wood = ModuleA::Wood.new

wood.say

desk = ModuleA::WoodDesk.new

desk.say

chair = ModuleA::WoodChair.new

chair.say


#try call the private method

puts "desk respond to say_private? #{desk.respond_to? :say_private}"

desk.say_private if desk.respond_to? :say_private
</div>

上面代码,执行public方法say,然后尝试执行private方法 say_private,执行先check是否能够执行,返回结果是不能执行,desk.respond_to? :say_private返回false:

I am a desk made of wood

I am a chair made of wood

desk respond to say_private? false
</div>

好,现在我们通过反射机制来构造对象,并尝试执行其私有方法。

我们注意到模块的定义中有三个常量,定义的是类名称,

    #the class name, later we will use it to create the corresponding object

    CLASS_NAME_OF_WOOD = "ModuleA::Wood"

    CLASS_NAME_OF_WOODDESK = "ModuleA::WoodDesk"

    CLASS_NAME_OF_WOODCHAIR = "ModuleA::WoodChair"

</div>
下面会通过这三个变量来理解Module.constants方法。

下面代码片段,基于上面的类定义:

obj_list = Array.new

tmp_const_sym_list = ModuleA.constants

tmp_const_sym_list.each do | sym |

    obj_list << ModuleA.const_get(sym)

    puts "calss = #{sym.class}, value = #{sym}"

end
</div>

我们注意到 ModuleA.constants,这个方法是Module模块中的,其作用是返回模块中所有常量的Symbol对象。我们看结果输出:

calss = Symbol, value = CLASS_NAME_OF_WOODDESK

calss = Symbol, value = CLASS_NAME_OF_WOODCHAIR

calss = Symbol, value = Wood

calss = Symbol, value = WoodDesk

calss = Symbol, value = WoodChair
</div>

从结果中看到,定义的三个常量和类名称都被返回了。所以注意:Ruby中的常量是包含定义的常量(变量)和类名称,注意他们都是Symbol对象。。

不过我们是需要根据类名称构造类对象,那么那三个常量就是没用的,需要删除。我们通过正则表达式匹配名字,来过滤。上面的代码修改一下:

sym_list = Array.new

tmp_const_sym_list = ModuleA.constants

tmp_const_sym_list.each do | sym |

    puts "calss = #{sym.class}, value = #{sym}"

    sym_list << ModuleA.const_get(sym) if /^Wood\w*/ =~ sym.to_s

end
</div>

sym_list << ModuleA.const_get(sym) if /^Wood\w*/ =~ sym.to_s,仅保存以Wood开头的symbol,这样我们就过滤掉了那三个常量。

找都类名称之后,开始构造对象:

obj_list = Array.new

sym_list.each do | sym |

    obj = sym.new

    obj_list << obj

    puts "create the object: #{obj}"

end


begin

obj_list.each do | wood |

    wood.say

end
</div>

调用Symbol的new方法构造出次对象(sym.new),然后我们调用对象的say方法:

您可能想查找下面的文章:

  • Ruby中访问SQL Server数据库的配置实例
  • Ruby使用C++扩展实例(含C++扩展代码示例)
  • ruby元编程实际使用实例
  • 优化Ruby脚本效率实例分享
  • Ruby中的反射(Reflection)应用实例
  • Ruby进行文件信息输出实例代码
  • ruby ftp封装实例详解
  • Ruby中钩子方法的运用实例解析
  • 实例讲解Ruby中的钩子方法及对方法调用添加钩子
  • 实例解析Ruby程序中调用REXML来解析XML格式数据的用法

相关文章

  • 简要说明Ruby中的迭代器
  • Ruby on Rails网站项目构建简单指南
  • Ruby程序中创建和解析XML文件的方法
  • Ruby学习笔记一
  • Ruby面向对象编程详解
  • 举例讲解Ruby中require的使用方法
  • 收集的多个ruby遍历文件夹代码实例
  • 利用Ruby的SOAP4R编写SOAP服务器的教程
  • 升级到mac 10.10之后使用pod出现问题的解决方法
  • Ruby设计模式编程之适配器模式实战攻略

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • ruby元编程实际使用实例
    • Ruby on Rails实现最基本的用户注册和登录功能的教程
    • 设计模式中的模板方法模式在Ruby中的应用实例两则
    • Ruby中require、load、include、extend的区别介绍
    • Ruby中Time对象的常用函数总结
    • Ruby中创建字符串的一些技巧小结
    • Ruby 取得指定月日期数的方法
    • 苹果mac OS X上安装metasploit
    • Ruby中的字符串编写示例
    • Ruby学习笔记一

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有