浏览 Ruby 源代码

6
我的主要目标是彻底理解我正在使用的库/宝石。我曾尝试在Github上从头到尾阅读源代码,但发现很难。我认为一个更加愉悦和温和的起点只是在使用每个库/宝石方法时阅读其源代码。
例如,我想知道Ruby on Rails中的redirect_to方法如何工作:
1. 我该如何查找redirect_to方法的源代码?
- 我知道在pry中可以执行类似show-method method的操作,但如何对Rails框架中的方法执行此操作?
2. 您有任何建议帮助我更好地了解宝石及其API吗?仅阅读源代码似乎非常困难,特别是对于框架而言。
谢谢!

1
如何在Rails框架中为方法执行此操作?方法就是方法。 - Sergio Tulentsev
抱歉,我没有完全理解您的回复,您是在建议我像这样做show-method redirect_to吗?如果是这样,我不确定如何将所需的模块加载到pry会话中。 - super_noobling
我该如何加载所需的模块 - 只需在Rails控制台中执行即可。在控制器中的某个位置设置断点(binding.pry),访问相应的URL以触发它,然后执行 show-source redirect_to - Sergio Tulentsev
谢谢!我现在明白了 :) - super_noobling
3个回答

4
RubyMine是符合我需求的IDE。它有以下这些功能,大大降低了阅读gem源代码的难度:
  • 在项目树中(在“外部库”伪目录下),Gems是项目的一部分,因此您可以像编辑自己的代码一样浏览和编辑它们。

  • 一个单一的按键命令(Mac上的command-B)从标识符(模块/类名、方法名等)导航到其声明,或者如果有多个声明则显示选择列表。它适用于您的代码和Gem代码。

  • 另一个命令(Mac上的option-command-O)允许您输入一个标识符名称以像上面那样导航。如果未在代码中找到您输入的内容,它会自动包含库代码;如果在您的代码中找到了您输入的内容,您可以再按一下键以无论如何包含gem代码。

  • 调试器不断显示您正在执行的代码。您可以在不编辑代码的情况下在所需位置设置断点。您可以检查实际执行的任何堆栈帧上面的任何堆栈帧。所有这些功能都与您的代码和Gem代码同样有效。

总体而言,RubyMine的所有功能都适用于Gem代码以及项目代码。

关于理解Gem的方法,除了阅读其源代码之外:大多数Gem在其README中有文档(我总是在Github上阅读),还可能在Gem的根目录或doc目录中有其他文档文件。一些Gem(包括Rails Gem)具有值得阅读的rdoc。然而,由于方便从使用Gem到其代码的导航,我通常首先尝试这样做,并在阅读实际代码之前在代码中阅读rdoc(如果有)。RubyMine也可以在使用标识符时显示其rdoc(在Mac上按F1),但我始终发现直接进入代码更容易些。


听起来很不错,我记得在使用RubyMine IDE时有类似的功能,但不幸的是它是付费的,像我这样的破产大学辍学生现在买不起这样的东西... - super_noobling
如果您花费大量时间编程,我认为它是值得的。但是,可以免费使用的方法包括免费试用、开源许可证和在用户组/聚会抽奖中赢取许可证,我已经赢了三次! - Dave Schweisguth
啊哈,我会去看一下的。谢谢你给我的IDE提示,如果有了IDE,我肯定会回来参考的。 - super_noobling
我对Rubymine和其他提示表示赞同。这正是我所做的。 - Sergio Tulentsev

2
学习如何使用gem的第一步是编写测试代码。Robert C. Martin认为,学习第三方代码很难,整合第三方代码也很难。在生产代码中尝试新内容可能会出错,我们可以通过编写一些测试来探索我们对第三方代码的理解,这些测试被称为学习测试。在学习测试中,我们调用第三方API,并且测试集中在我们想要从API中获得的东西上。当你真正关注内部工作原理时,需要阅读源代码。至于redirect_to在ActionController :: Redirecting中定义的位置,请参考此链接:https://github.com/rails/rails/blob/52ce6ece8c8f74064bb64e0a0b1ddd83092718e1/actionpack/lib/action_controller/metal/redirecting.rb

我明白了,感谢你的想法!我很感激你直接回答我的问题,但是有没有一种系统化的方法来找到方法的源代码呢? - super_noobling
唉,我没有任何系统的方法。 - floum

2
如果您能将代码放入控制器中,这通常会更具说明性。
raise method(:redirect_to).source_location.inspect

这将准确地显示出方法的定义位置。

在处理类似于这样的大型代码库时,我通常会非常依赖 git

git grep 'def redirect_to'

如果没有找到任何内容:
git grep 'redirect_to'

你可能需要更仔细地过滤,但通常实现在视觉上很突出。
Ruby代码的好处是它通常很易读,并且在其中搜索通常比其他语言更愉快。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接