在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/
分享到:
相关推荐
在Ruby中,可以使用类工厂或者模块工厂来实现,如定义一个创建对象的工厂类,根据传入参数返回不同类型的实例。 2. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。Ruby中的`Singleton`模块可以轻松...
- **BasicObject类**:为创建代理类提供了更简洁的基类,减少了method_missing的使用。 然而,尽管Ruby 1.9提供了诸多改进,但它仍处于开发阶段,不适用于生产环境。Rails核心团队和其他gem及插件开发者正在努力...
Ruby-Sneakers是一个高效、基于Ruby语言的后台处理框架,它充分利用了RabbitMQ作为其消息中间件。这个框架的设计目标是提供一个简洁、高性能的解决方案,用于处理后台任务和异步工作流程,从而提高应用的响应速度和...
在Ruby中,装饰模式常常通过包含目标类或继承自同一个抽象类来实现。以下是一个简单的装饰模式示例,展示了如何给一个饮料对象添加不同的调料: ```ruby module Drink def describe raise "子类必须实现describe...
在描述中提到的实例中,`SimpleWriter` 是一个基础的文本写入类,它可以打开文件并写入一行文本。装饰器模式的实现始于 `WriterDecorator` 类,这是一个抽象基类,它接收一个 `real_writer` 对象作为参数,并提供了...
在Ruby中,代理模式可以通过定义代理类来实现,代理类持有对真实对象的引用。 ### 行为型模式 #### Chain of Responsibility(责任链) 责任链模式允许请求沿着处理者链传递,直到有一个处理者处理它为止。在Ruby...
Ruby的闭包和对象模型使得创建代理对象非常简单。 7. **命令模式**:将请求封装为一个对象,从而使用户可以参数化不同请求,对请求排队或记录请求日志,以及支持可撤销的操作。Ruby中,可以使用类和实例方法来实现...
例如,Ruby中的Singleton模块可以轻松实现单例类,确保在整个程序中只有一个实例存在。 结构型模式如适配器模式(Adapter)、装饰器模式(Decorator)和代理模式(Proxy)等,关注如何将不同组件组合在一起。Ruby的...
4. 实现服务:在服务器端,你需要创建一个实现了`.ice`文件中定义的服务类,并启动ICE运行时环境,注册你的服务实例。 5. 调用服务:在客户端,创建服务代理实例,然后通过代理调用服务器端的方法。代理是透明的,...
1. **单例模式**:在Ruby中,单例类(Singleton)用于确保一个类只能有一个实例。通常,通过模块级别的`singleton_class`方法和`instance`方法来实现。这种模式常用于配置管理或全局状态控制。 2. **工厂方法模式**...
- **模块(Module)**:Ruby中的模块不仅可以作为命名空间来组织代码,还可以通过`include`和`extend`来扩展类的功能,这是Ruby元编程中最常用的技术之一。 - **类和对象的创建**:通过`Class.new`和`Object.new`...
3. 开放的秘密(Open Secret):当类的一个实例变量只有在某些特定情况下才有值,这可能导致代码的复杂性增加。考虑将这个变量封装到一个条件对象中,或者用方法代替。 4. 临时字段(Temporary Field):如果一个...
在iOS应用开发中,`UIViewController` 是一个核心的类,它负责管理屏幕上的内容和用户交互。这个项目提供了一个小的Objective-C类别扩展,用于在`UIViewController`上添加交互式弹出手势,以便优雅地关闭动画键盘。...
- Ruby中的对象与类的概念。 - 实例变量与类变量的区别。 - 方法调用与消息传递机制。 - **基础语法** - 变量声明与赋值规则。 - 数组与哈希的创建与操作。 - 控制结构(如if语句、while循环、for循环等)。 ...
在RubyRetriever中,我们可能会看到类、模块、方法、闭包等面向对象概念的运用,以及元编程技术如`define_method`来动态创建方法。 2. **异步编程**:Ruby通过EventMachine库实现了非阻塞I/O,这是实现异步爬虫的...
比如说C和A不在一个服务器上,A要频繁的调用C,我们可以在A上做一个代理类Proxy,把访问C的工作交给Proxy,这样对于A来说,就好像在直接访问C的对象。在对A的开发中我们可以把注意力完全放在业务的实现上。 GoF...
- **类与对象**:Ruby 是一种纯面向对象的语言,每个值都是一个对象,所有操作都是对对象的调用。 - **继承与多态**:Ruby 支持类的继承,子类可以继承父类的属性和方法,并可覆盖或扩展这些特性,实现多态性。 -...
在Ruby中,可以使用`BasicObject`作为基类创建代理类。 6. **策略模式(Strategy)** - 定义一系列算法,并将每一个算法封装起来,使它们可以相互替换,让算法的变化独立于使用它的客户。Ruby中的闭包和模块可以很...
Ruby中的装饰器可以通过组合(Composition)来实现,即创建一个新类包裹原始对象,并在其上添加所需功能,同时保持对原始对象的透明访问。 这些设计模式是Ruby开发中不可或缺的工具,它们帮助开发者遵循SOLID原则,...