icon Rails 的相关感想

读 Rails 的源码

我最喜欢读Rails 的源码。

虽然有很多复杂怪异难以理解的东西,但是有时遇见简洁美丽的代码会不自主地有一点点感动。

如果你还没有读过的话,我推荐 ActiveSupport 的 extract_options.rbattribute_accessors.rb

存储源码的地方会根据环境而有所不同,Windows 的话,是在安装 Ruby 的文件夹,而 Linux 的话是从 /usr/lib/ruby/ 目录进入gems/1.8/gems/activesupport-2.0.2/lib/active_support/core_ext ,源码就在其中的 arrayclass 文件夹(目录)里。(请将 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#flattenObject#is_a?Module#class_eval 等等,如果看到喜爱 Rubyist 的方法们在恰当的文本里大显身手的话,一定是件快乐的事情的吧。

--
黒田努

(2008/05/02)