- 浏览: 1386514 次
- 性别:
- 来自: 火星
文章分类
最新评论
-
aidd:
内核处理time_wait状态详解 -
ahtest:
赞一下~~
一个简单的ruby Metaprogram的例子 -
itiProCareer:
简直胡说八道,误人子弟啊。。。。谁告诉你 Ruby 1.9 ...
ruby中的类变量与类实例变量 -
dear531:
还得补充一句,惊群了之后,数据打印显示,只有一个子线程继续接受 ...
linux已经不存在惊群现象 -
dear531:
我用select试验了,用的ubuntu12.10,内核3.5 ...
linux已经不存在惊群现象
其实这个类实现的功能很简单,那就是实现一个没有predefined 方法的类(除了__send__与__id__).自己也尝试着写了一个,思路什么和BlankSlate很接近,不过代码就丑陋多了。
当写这段代码之前,我们先要分析一下如何才能去掉predefined的方法,这里有三种predefined的方法。
1 Object类本身自带的一些实例方法.
2 打开Kernel模块,或者Object类,然后动态的加入的方法。
3 Object类include的模块里面所含有的方法:
接下来看代码,我在里面会有注释 :
当写这段代码之前,我们先要分析一下如何才能去掉predefined的方法,这里有三种predefined的方法。
1 Object类本身自带的一些实例方法.
2 打开Kernel模块,或者Object类,然后动态的加入的方法。
module Kernel def name1 "bo" end end class Object def name2 "bo" end end
3 Object类include的模块里面所含有的方法:
module Name def name3 "bo" end end class Object include Name end
接下来看代码,我在里面会有注释 :
class BlankSlate class << self #首先,我们定义一个hide方法,这个方法就是隐藏掉BlankSlate类中名字为name的方法,可是instance_eval方法,或者__开头的方法,并不需要被隐藏. def hide(name) if instance_methods.include?(name.to_s) and name !~ /^(__|instance_eval)/ @hidden_methods ||= {} @hidden_methods[name.to_sym] = instance_method(name) undef_method name end end #这里提供一个可以查找一个方法是否已被隐藏的方法 def find_hidden_method(name) @hidden_methods ||= {} @hidden_methods[name] || superclass.find_hidden_method(name) end #这个是为了恢复所被隐藏的方法,首先使用上面的方法查找到方法,(这里使用了define_method,这个方法其实也就是动态的定义一个方法,name就是他的名字,详细的用法可以看我前面的文章) def reveal(name) bound_method = nil unbound_method = find_hidden_method(name) fail "Don't know how to reveal method '#{name}'" unless unbound_method define_method(name) do |*args| bound_method ||= unbound_method.bind(self) bound_method.call(*args) end end end #这里执行hide操作 instance_methods.each { |m| hide(m) } end ###################################################################### #这里解决了第二个问题,那就是当一个方法被加入的时候,能够hide这个方法(这里使用了method_added(这个方法我认为是当加入了一个方法之后,然后就会调用这个方法,name就是你所加入的方法的名字). module Kernel class << self alias_method :blank_slate_method_added, :method_added def method_added(name) result = blank_slate_method_added(name) return result if self != Kernel BlankSlate.hide(name) result end end end 这里其实我们也可以这么做: module Kernel class << self # Detect method additions to Kernel and remove them in the # BlankSlate class. def method_added(name) return super if self != Kernel BlankSlate.hide(name) super end end end ###################################################################### #这个和上面一样的。 class Object class << self alias_method :blank_slate_method_added, :method_added # Detect method additions to Object and remove them in the # BlankSlate class. def method_added(name) result = blank_slate_method_added(name) return result if self != Object BlankSlate.hide(name) result end def find_hidden_method(name) nil end end end ###################################################################### #这里是为了解决第三个问题,要注意的是append_features就是include时发生的动作,也就可以说,他其实就是include.所以这里我们必须先保存老的append_features方法,先加入mod方法,然后undef它,最后再返回其他的方法. class Module alias blankslate_original_append_features append_features def append_features(mod) result = blankslate_original_append_features(mod) return result if mod != Object instance_methods.each do |name| BlankSlate.hide(name) end result end end
发表评论
-
一个创建闭包的小技巧
2008-06-05 00:12 2077一个小技巧,在Ola Bini 的blog上看到的。 假设你 ... -
解决Colored Cubes问题
2008-06-02 10:43 2732Engineering Puzzle You have fo ... -
ruby1.9中的Iterators
2008-03-05 22:37 3658在ruby1.9中增加了External Iterators这 ... -
一个简单的ruby Metaprogram的例子
2008-03-03 23:49 4037比如下面一个文件 people.txt 引用name,age ... -
Ruby Object Model
2008-03-03 19:29 3489刚好看到,保存一下. -
一个检测方法的参数类型的小程序
2008-03-02 22:48 3210今天没事看blog的时候,看到一个小子实现了这个,不过他的程序 ... -
ruby中的类变量与类实例变量
2008-02-26 21:15 7565首先,在ruby1.8中类变量是所有子类和父类共享的,可以看下 ... -
在ubuntu上共存多个版本的ruby
2008-02-24 15:20 4336今天装Revactor库的时候,真把我郁闷了,没想到ubunt ... -
看到了一个用ruby写的scheme解释器
2008-02-16 21:35 3697,自己本来想等啥时候有时间做个类似的东西呢,没想到已经有人做 ... -
ruby way之处理RSS和Atom
2008-01-31 01:32 34711 rss 标准库 RSS 是基于xml的,因此你能简单的将 ... -
ruby way之使用REXML解析xml
2008-01-30 00:35 9187REXML 是一个完全用ruby写的processor ,他有 ... -
rails2中的一些被废弃的用法
2008-01-29 00:33 2488这些只是自己最近看web开发敏捷之道的时候(由于书中的版本是1 ... -
ruby way之动态特性之二
2008-01-25 00:49 36061 得到所定义的实体的列表 ruby的反射api能够使我们在 ... -
ruby way之动态特性之一
2008-01-23 01:25 44451 动态的evaluate代码 全局的方法eval 编译并且 ... -
ruby way之高级OOP特性之二
2008-01-20 03:43 28831 把代码像对象一样存储 当你想要以对象的形式存储一块代码的 ... -
ruby way之高级OOP特性之一
2008-01-19 12:14 21971 发送一条消息给一个对象 当你调用一个方法时,你也就是发送 ... -
ruby way之OOP之二
2008-01-16 23:59 23021 理解allocate 在一些特殊的环境中,你可能需要不调 ... -
ruby way之OOP之一
2008-01-16 00:25 25931 使用多个构造方法 在ruby中没有像c++或者ruby中 ... -
ruby way之连接数据库
2008-01-14 00:47 2435这边都只是个大概,具体的要自己去看文档了. 1 连接SQLi ... -
ruby way之高级数据存取
2008-01-13 02:31 3660经常我们需要以一种更 ...
相关推荐
rails-exporter-源码.rar
ruby on rails社区网站开发源码
rails-tutorial-源码.rar
rails-playlists-源码.rar
ruby on rails 教程源码,配合原书使用
一个用Ruby on Rails搭建的图片分享的网站项目.完整源代码
Rails.Recipes.Rails.3.Edition.和源码
bhl_rails_solr-源码.rar
angular_rails_csrf-源码.rar
Ruby on Rails中文指南
基于ruby on rails开发示例源码
Rails进行敏捷Web开发(所有版本的源码rails3.0-4.0) 3.0,3.1,3.2,4.0
入门rails的第一个demo
Ruby On Rails中文教材(PDF)
本书源码 博文链接:https://msnvip.iteye.com/blog/139752
敏捷Rails中文教程 敏捷Rails中文教程 敏捷Rails中文教程
rails指南 中文版
rails-assets, 在 Rails 中,资产管理的解决 Rails 资产 Bundler 到 Bower 代理本自述文件涉及项目的开发方面。 访问站点了解如何在你的应用程序中使用 Rails 资产。 插件开发设置git clone git@github.com:tenex/r
《Rails之道》详细讨论了Rails的程序代码并通过分析Rails中的代码片段来深入解释它的功能,同时,《Rails之道》部分章节也摘录了一些API文档中的内容,使读者能够快速地找到对应的API文档、相关的示例代码以及深入...
使用Aptana+Rails开发Rails Web应用 有Aptana的安装配置等等,中文