学习元编程的过程中了解到 Rails 大量使用了 Ruby 的元编程,所以想自己有一定基础后读一下 Rails 的源码,不知道大家怎么看这个问题?
看过一点 目的不是学习元编程,学习元编程的话看书是最有效的。 第一次看 rails 源码是因为想不明白 activerecord 的 lazy query 怎么实现的,看了一个通宵明白了。 还有是写插件需要了解 rails 内部的一些机制 再就是在 github 上看到某个提交的 commit 信息,感兴趣会点进去看看。
偶尔看一两眼,正准备好好看看。有些代码也很有趣,不知道是什么原因加进去的,很搞笑,比如一个扩展 Array 的代码如下: # Equal to self[41]. Also known as accessing "the reddit". def forty_two self[41] end
为什么加个 42 在这里,真的让人百思不得其解。这个 "the reddit" 到底是什么意思?
#3 楼 @hooopo 呵呵,又是元编程和 Rails 源码的话题。 我只读过一点点源码, 每当我好奇某些功能的实现机制的时候, 我就会通过 CTags 切换到 Rails 源码中,看一会。 有些功能实现的很复杂,看一会,看不完,就会需要很长时间。
建议楼主,有针对性的去阅读,这样没那么枯燥。 起初,Ruby 语法不是很熟,看源码的时候,就会很吃力, 但是,这也是一个检验自己 Ruby 语法掌握程度的机会, 当知道自己那些语法不懂后,再主动去学习 Ruby 语法, 然后再回来接着看。 反反复复一段时间,语法就不再是问题。
我觉得,当语法不再是阻碍的时候, 看 Rails 源码的时候,最大的困难就是, 有些功能的实现的逻辑比较复杂,需要有耐心,慢慢研究。
还有,最麻烦的就是, 我想进入某一个函数的时候, 我都用 CTags 在源码中 切换, 因为函数和类名经常出现重复。 感觉有些时候,很不方便,
比如:
def belongs_to(name, options = {})
Builder::BelongsTo.build(self, name, options)
end
以上代码中我想查看 build 函数的源码, 我用 CTags 一查列出来 20 多处 build 函数的定义, 我一个一个在里面找,效率很低, 很影响节奏, 你们有什么好办法吗?你们平时都怎么看?
#17 楼 @ery 遇到这种情况还是人去看方便,工具就不灵了:-)
belongs to 是和关联相关的: https://github.com/rails/rails/blob/3-2-stable/activerecord/lib/active_record/associations.rb
在这里找到关联里和 belongs to 相关的: https://github.com/rails/rails/blob/3-2-stable/activerecord/lib/active_record/associations.rb#L132 https://github.com/rails/rails/blob/3-2-stable/activerecord/lib/active_record/associations.rb#L118
然后找对应的 builder: https://github.com/rails/rails/blob/3-2-stable/activerecord/lib/active_record/associations/builder/belongs_to.rb#L13
#21 楼 @ery 还是用 ActiveRecord::Associations::Builder::BelongsTo.build
这个例子:
根据 Ruby 的目录组织习惯,BelongsTo 这个类应该在 active_record/associations/builder/belongs_to.rb 里定义的。
进去一看,嗨,还真找到了...
还有一些继承的,去看父类或 Mixin 就可以了。Rails 做的很好了,注释里都有继承关系:
# Association
# SingularAssociation
# HasOneAssociation
# HasOneThroughAssociation + ThroughAssociation
# BelongsToAssociation
# BelongsToPolymorphicAssociation
# CollectionAssociation
# HasAndBelongsToManyAssociation
# HasManyAssociation
# HasManyThroughAssociation + ThroughAssociation