Rails 的相关感想
读 Rails 的源码
我最喜欢读Rails 的源码。
虽然有很多复杂怪异难以理解的东西,但是有时遇见简洁美丽的代码会不自主地有一点点感动。
如果你还没有读过的话,我推荐 ActiveSupport 的 extract_options.rb 和 attribute_accessors.rb 。
存储源码的地方会根据环境而有所不同,Windows 的话,是在安装 Ruby 的文件夹,而 Linux 的话是从 /usr/lib/ruby/ 目录进入gems/1.8/gems/activesupport-2.0.2/lib/active_support/core_ext ,源码就在其中的 array 及 class 文件夹(目录)里。(请将 2.0.2 换成适当的版本号) 。
extract_options.rb (去掉说明的话),总的来说是这样写的:
module ActiveSupport
module CoreExtensions
module Array
module ExtractOptions
def extract_options!
last.is_a?(::Hash) ? pop : {}
end
end
end
end
end
这个文件被 1 层上的 array.rb require ,在 Array 类里追加了 extract_options! 方法。
方法的内容只有一行。
last.is_a?(::Hash) ? pop : {}
数组最后的元素是散列表的话就从数组中将其删除,再返回这个散列表。如果不是散列表的话,就生成一个空的散列表并返回。因为数组的内容可能改变,所以按照 Ruby 的习惯在方法名上添加 ! 。
怎么样?好象俳句一样的吧。
在 Rails 的方法中,有很多最后作为选项参数,取得散列表。 ActiveRecord::Base#find 等这种方法大体上是通过 extract_options! 方法抽取选项参数。
另一个要推荐的是 attribute_accessors.rb 代码不到 50 行。在 Rails 的源码中经常出现的,神秘的 cattr_accessor 方法就是通过此定义的。
因为太长了所以就不再就源代码举例了。但是请务必要尝试打开文本编辑器欣赏一下。Array#flatten、Object#is_a?、Module#class_eval 等等,如果看到喜爱 Rubyist 的方法们在恰当的文本里大显身手的话,一定是件快乐的事情的吧。
--
黒田努
(2008/05/02)
- 前言
- Rails是否能成为企业领域的主流 (2008/03/29)
- Rails 2.0 测速 (2008/03/30)
- 测试驱动开发和调试代码 (2008/04/07)
- Git or Mercurial (2008/04/22)
- RESTful Ruby on Rails -- 美丽与复杂 (2008/04/23)
- RESTful Ruby on Rails -- 单数与复数 (2008/04/24)
- 读 Rails 的源码 (2008/05/02)
- sudo: no passwd entry for app! (Capistrano 2.3.0) (2008/05/12)
- Rails on GlassFish (2008/06/18)
- 怎样回答“Ruby 没有类型声明,在规范的系统里能使用吗?”这样的问题 (2008/11/23)
- 怎样回答“Ruby是脚本语言,不是有点慢吗”这样的问题 (2008/11/24)
- 哪种编程语言将来有前途 (2009/01/10)
- 哪种框架将来有前途 (2009/01/11)
- 框架 VS CMS (2009/01/12)
- Rails 2.3 spawner/reaper 变为 DEPRECATED (2009/03/25)
- db/seeds.rb (2009/06/08)
- LESS与Sass (2009/08/03)
- Rails 2.3.4 与 I18n (2009/08/15)

