rails delegate机制
Delegate是一种应用composite来代替extend的机制,可以有效地降低代码的耦合性。
Rails 2.2增加了delegate方法,可以十分方便地实现delegate机制。
01.def delegate(*methods)
02. options = methods.pop
03. unless options.is_a?(Hash) && to = options[:to]
04. raise ArgumentError, "Delegation needs a target. Supply an options hash with a :to key as the last argument (e.g. delegate :hello, :to => :greeter)."
05. end
06.
07. if options[:prefix] == true && options[:to].to_s =~ /^[^a-z_]/8. raise ArgumentError, "Can only automatically set the delegation prefix when delegating to a method."9. end
10.
11. prefix = options[:prefix] && "#{options[:prefix] == true ? to : options[:prefix]}_"
12.
13. methods.each do |method|
14. module_eval(<<-EOS, "(__DELEGATION__)", 1)
15. def #{prefix}#{method}(*args, &block)
16. #{to}.__send__(#{method.inspect}, *args, &block)
17. end
18. EOS
19. end
20.end
delegate方法首先检查传入的参数,正确参数形式为:method1, :method2, ..., :methodN, :to => klass[, :prefix => prefix]
delegate要求参数的最后必须是一个Hash,:to表示需要代理的类,:prefix表示代理的方法是否要加前缀,如果:prefix => true,则代理的方法名为klass_method1,
klass_method2, ..., klass_methodN,如果:prefix => prefix (prefix为string),则代理的方法名为prefix_method1, prefix_method2, ..., prefix_methodN。
最终通过module_eval动态生成每个方法定义。通过__send__方法调用:to类的方法。
来看看调用的例子:
简单的调用:
01.class Greeter < ActiveRecord::Base
02. def hello() "hello" end
03. def goodbye() "goodbye" end
04.end
05.
06.class Foo < ActiveRecord::Base
07. delegate :hello, :goodbye, :to => :greeter
08.end
09.
10.Foo.new.hello # => "hello"
11.Foo.new.goodbye # => "goodbye"
增加:prefix => true:
1.class Foo < ActiveRecord::Base
2. delegate :hello, :goodbye, :to => :greeter, :prefix => true
3.end
4.
5.Foo.new.greeter_hello # => "hello"
6.Foo.new.greeter_goodbye # => "goodbye"
自定义前缀名:
1.class Foo < ActiveRecord::Base
2. delegate :hello, :goodbye, :to => :greeter, :prefix => :foo
3.end
4.
5.Foo.new.foo_hello # => "hello"
6.Foo.new.foo_goodbye # => "goodbye"
ruby的动态性再一次发挥了强大的功能!
转自:http://www.cnblogs.com/orez88/articles/1717438.html
rails delegate机制的更多相关文章
- iOS消息传递机制
每个应用或多或少都由一些需要相互传递消息的对象结合起来以完成任务.在这篇文章里,我们将介绍所有可用的消息传递机制,并通过例子来介绍怎样在苹果的框架里使用.我们还会选择一些最佳范例来介绍什么时候该用什么 ...
- IOS OS X 中集中消息的传递机制
1 KVO (key-value Observing) 是提供对象属性被改变是的通知机制.KVO的实现实在Foundation中,很多基于 Foundation 的框架都依赖与它.如果只对某一个对象的 ...
- IOS开发之delegate和Notification的区别
delegate针对one-to-one关系,并且reciever可以返回值给sender: notification 可以针对one-to-one/many/none,reciever无法返回值给s ...
- Gradle 用法总结
用过android studio的对gradle应该都不陌生了,gradle文件的基本配置大同小异,略做了解使用应该是没什么问题了.但是深入细致的了解一下对于理解项目还是很有帮助的,尤其是遇到一些配置 ...
- Android Gradle 经验总结
用过android studio的对gradle应该都不陌生了,gradle文件的基本配置大同小异,略做了解使用应该是没什么问题了.但是深入细致的了解一下对于理解项目还是很有帮助的,尤其是遇到一些配置 ...
- [Tomcat] Tomcat的classloader
定义 同其他服务器应用一样,tomcat安装了各种classloader(classes that implement java.lang.ClassLoader) Bootstrap | Syste ...
- 如何给开源的DUILib支持Accessibility
最近的工作是给开源的DUILib支持Accessibility, 一些经验记录并分享下. 微软的Accessibility其实Windows平台上一个挺重要的东西, 尽管在国内不受重视,但是如果你的软 ...
- 李洪强iOS经典面试题135-Objective-C
可能碰到的iOS笔试面试题(5)--Objective-C 面试笔试都是必考语法知识的.请认真复习和深入研究OC. Objective-C 方法和选择器有何不同?(Difference between ...
- Gradle学习系列之三——读懂Gradle语法
在本系列的上篇文章中,我们讲到了创建Task的多种方法,在本篇文章中,我们将学习如何读懂Gradle. 请通过以下方式下载本系列文章的Github示例代码: git clone https://git ...
随机推荐
- Centos7/RHEL 7 配置静态路由
如图: 业务地址:192.168.10.0/24 192.168.20.0/24管理地址:172.168.10.0/24 172.168.20.0/24 需求:每台主机配置两张网卡,分别连 ...
- Oracle查看被锁的表,并释放
几个相关的表 SELECT * FROM v$lock; SELECT * FROM v$sqlarea; SELECT * FROM v$session; SELECT * FROM v$proce ...
- 关于因各种原因,造成LINUX主机不能通过域名访问自己的解决办法
因路由黑洞或其它原因造成自己域名或外网IP的解决办法: vi /etc/hosts 添加一行: 10.28.86.250 www.edusoa.com 保存退出.
- 移动APP 支付宝快捷支付开发流程
[代码] [Java]代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ...
- Codeforces #447 Div2 E
#447 Div2 E 题意 给出一个由有向边构成的图,每条边上有蘑菇,假设有 \(n\) 个蘑菇,那么第一次走过这条边可以获得 \(n\) 个蘑菇,第二次 \(n-1\),第三次 \(n-1-2\) ...
- hdu6058
hdu6058 题意 定义 \(f(l, r, k)\) 函数为区间 \([l, r]\) 第 \(k\) 大的数,如果 \(r - l + 1 < k\),\(f = 0\) .求 \(\su ...
- 简单DP【p2642】双子序列最大和
Description 给定一个长度为n的整数序列,要求从中选出两个连续子序列,使得这两个连续子序列的序列和之和最大,最终只需输出最大和.一个连续子序列的和为该子序列中所有数之和.每个连续子序列的最小 ...
- [SPOJ]DIVCNT3
别人写的讲得挺好的博客 洲阁筛,一种快速求积性函数前缀和的算法 求$\sum\limits_{i=1}^nF(i)$,其中$F(x)$是积性函数,并且$F(p^c)$是关于$p$的低阶多项式 我们把$ ...
- 【置换群】CH Round #63 - OrzCC杯#2省选热身赛 exchange
第一问置换群裸题. 第二问单独考虑某个循环,任意交换两个元素,稍微画一下就会发现,把该循环拆成了2个,剩下所需的交换次数减少了1,也就是说,第一步我们任意交换,都能够保证交换次数最少.于是一个循环的答 ...
- 【模拟】bzoj2760 [JLOI2011]小A的烦恼
注意细节和初始化. #include<cstdio> #include<string> #include<algorithm> #include<iostre ...