`
机器人
  • 浏览: 85986 次
  • 性别: Icon_minigender_2
  • 来自: Google
社区版块
存档分类
最新评论

怎么样在Ruby中创建一个代理类?

阅读更多
在Ruby创建一个代理类有些时候可以帮助我们做一些很coo的事情,事实上实现这个很简单的。你有没有思考过Rails的ActiveRecord中的关联一例:
user = User.first
user.orders.build
# => #Order object

user.orders.first
# => #Order ojbect

user.orders.class
# => Array


看清楚,Array数组可并没有build这个方法。那是怎么样做的呢?

一般是我们来给Array添加一个build方法,不过这样做太混乱了,不好,我们不需要为每一个Array添加这个方法,更重要的是我们知道我创建的对象是什么类型的。它是做到这个的呢?

答案是给Array一个代理,实现起来很简单,看:
class Proxy
    instance_methods.each { |m| undef_method m unless m =~ /(^__|^send$|^object_id$)/ }

    def my_awesome_method
       "you just called an awesome method!"
    end

    protected
        def method_missing(name, *args, &block)
          target.send(name, *args, &block)
        end

        def target
          []
        end
end


注意上面的代码所做的第一件事情就是undefine类中的每一个方法。通过这样可以确保能每次触发method_missing方法,然后由Array来调用。我们接下来定义我们自己的方法,如‘my_awesome_method’。很简单也很巧妙吧,看看上面的代码执行的结果:

proxy = Proxy.new
proxy.my_awesome_method
# => "you just called an awesome method!"

proxy.class
# => Array


看起来很cool中吧。
-------------------------------
原文:http://www.binarylogic.com/2009/08/07/how-to-create-a-proxy-class-in-ruby/
0
0
分享到:
评论

相关推荐

    Ruby-Ruby中的GoF设计模式实现

    在Ruby中,可以使用类工厂或者模块工厂来实现,如定义一个创建对象的工厂类,根据传入参数返回不同类型的实例。 2. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。Ruby中的`Singleton`模块可以轻松...

    为何Ruby 1.9的不兼容性会导致原有Ruby代码无法工作

    - **BasicObject类**:为创建代理类提供了更简洁的基类,减少了method_missing的使用。 然而,尽管Ruby 1.9提供了诸多改进,但它仍处于开发阶段,不适用于生产环境。Rails核心团队和其他gem及插件开发者正在努力...

    Ruby-Sneakers一个基于RubyRabbitMQ的快速后台处理框架

    Ruby-Sneakers是一个高效、基于Ruby语言的后台处理框架,它充分利用了RabbitMQ作为其消息中间件。这个框架的设计目标是提供一个简洁、高性能的解决方案,用于处理后台任务和异步工作流程,从而提高应用的响应速度和...

    Ruby使用设计模式中的代理模式与装饰模式的代码实例共3页

    在Ruby中,装饰模式常常通过包含目标类或继承自同一个抽象类来实现。以下是一个简单的装饰模式示例,展示了如何给一个饮料对象添加不同的调料: ```ruby module Drink def describe raise "子类必须实现describe...

    实例讲解Ruby使用设计模式中的装饰器模式的方法

    在描述中提到的实例中,`SimpleWriter` 是一个基础的文本写入类,它可以打开文件并写入一行文本。装饰器模式的实现始于 `WriterDecorator` 类,这是一个抽象基类,它接收一个 `real_writer` 对象作为参数,并提供了...

    gof patterns in ruby

    在Ruby中,代理模式可以通过定义代理类来实现,代理类持有对真实对象的引用。 ### 行为型模式 #### Chain of Responsibility(责任链) 责任链模式允许请求沿着处理者链传递,直到有一个处理者处理它为止。在Ruby...

    Design Patterns in Ruby Dec 2007.rar

    Ruby的闭包和对象模型使得创建代理对象非常简单。 7. **命令模式**:将请求封装为一个对象,从而使用户可以参数化不同请求,对请求排队或记录请求日志,以及支持可撤销的操作。Ruby中,可以使用类和实例方法来实现...

    ruby设计模式的代码有好多

    例如,Ruby中的Singleton模块可以轻松实现单例类,确保在整个程序中只有一个实例存在。 结构型模式如适配器模式(Adapter)、装饰器模式(Decorator)和代理模式(Proxy)等,关注如何将不同组件组合在一起。Ruby的...

    ice最简单实现 ruby调用ice接口 - Ruby - language - ITeye论坛

    4. 实现服务:在服务器端,你需要创建一个实现了`.ice`文件中定义的服务类,并启动ICE运行时环境,注册你的服务实例。 5. 调用服务:在客户端,创建服务代理实例,然后通过代理调用服务器端的方法。代理是透明的,...

    ruby-design-patterns:Russ Olsen 的 Ruby 设计模式

    1. **单例模式**:在Ruby中,单例类(Singleton)用于确保一个类只能有一个实例。通常,通过模块级别的`singleton_class`方法和`instance`方法来实现。这种模式常用于配置管理或全局状态控制。 2. **工厂方法模式**...

    Metaprogramming Ruby

    - **模块(Module)**:Ruby中的模块不仅可以作为命名空间来组织代码,还可以通过`include`和`extend`来扩展类的功能,这是Ruby元编程中最常用的技术之一。 - **类和对象的创建**:通过`Class.new`和`Object.new`...

    addison.wesley.refactoring.ruby

    3. 开放的秘密(Open Secret):当类的一个实例变量只有在某些特定情况下才有值,这可能导致代码的复杂性增加。考虑将这个变量封装到一个条件对象中,或者用方法代替。 4. 临时字段(Temporary Field):如果一个...

    UIViewController上的一个小类别,用于使用交互式弹出手势启用动画键盘关闭_Objective-C_Ruby.zip

    在iOS应用开发中,`UIViewController` 是一个核心的类,它负责管理屏幕上的内容和用户交互。这个项目提供了一个小的Objective-C类别扩展,用于在`UIViewController`上添加交互式弹出手势,以便优雅地关闭动画键盘。...

    Ruby高级编程教程-世界顶级高校教材(完整版827页)

    - Ruby中的对象与类的概念。 - 实例变量与类变量的区别。 - 方法调用与消息传递机制。 - **基础语法** - 变量声明与赋值规则。 - 数组与哈希的创建与操作。 - 控制结构(如if语句、while循环、for循环等)。 ...

    Ruby-RubyRetriever异步Web爬虫

    在RubyRetriever中,我们可能会看到类、模块、方法、闭包等面向对象概念的运用,以及元编程技术如`define_method`来动态创建方法。 2. **异步编程**:Ruby通过EventMachine库实现了非阻塞I/O,这是实现异步爬虫的...

    解析proxy代理模式在Ruby设计模式开发中的运用

     比如说C和A不在一个服务器上,A要频繁的调用C,我们可以在A上做一个代理类Proxy,把访问C的工作交给Proxy,这样对于A来说,就好像在直接访问C的对象。在对A的开发中我们可以把注意力完全放在业务的实现上。 GoF...

    使用 Ruby 进行 Web 应用程序的开发和部署.zip

    - **类与对象**:Ruby 是一种纯面向对象的语言,每个值都是一个对象,所有操作都是对对象的调用。 - **继承与多态**:Ruby 支持类的继承,子类可以继承父类的属性和方法,并可覆盖或扩展这些特性,实现多态性。 -...

    ruby_patters:6 semak

    在Ruby中,可以使用`BasicObject`作为基类创建代理类。 6. **策略模式(Strategy)** - 定义一系列算法,并将每一个算法封装起来,使它们可以相互替换,让算法的变化独立于使用它的客户。Ruby中的闭包和模块可以很...

    design-patterns-ruby:Ruby设计模式

    Ruby中的装饰器可以通过组合(Composition)来实现,即创建一个新类包裹原始对象,并在其上添加所需功能,同时保持对原始对象的透明访问。 这些设计模式是Ruby开发中不可或缺的工具,它们帮助开发者遵循SOLID原则,...

Global site tag (gtag.js) - Google Analytics