查看irb中定义符号的位置

时间:2012-03-30 00:08:57

标签: ruby-on-rails ruby irb

我在工作中处理一个非常大的rails项目。有时我需要寻找类/常量定义。 Ruby中有一些内置的方法可以帮我吗?例如:

irb> SOME_CONSTANT.__file__
=> /some/path/to/a/file

3 个答案:

答案 0 :(得分:1)

这不是您正在寻找的,但方法对它们有.source_location方法。您可以使用它来查找实际实现类的位置。 (因为ruby允许你重新打开课程,这可能在多个地方)

例如,给定一个对象的实例, i

i.methods.map do |method_name| 
  method_obj = i.method(method_name)
  file, line = method_obj.source_location
  file #map down to the file name
end.uniq

将为您提供实现 i 方法的所有文件的列表。

这适用于在ruby中至少实现1个方法的类。但它不适用于常数。

答案 1 :(得分:0)

在加载任何文件之前的最开始,插入一行,该行定义要检查的类/常量,而不是模块。例如,假设您的代码中有类或其他类型的常量A,并且想知道它的定义位置。然后,在主文件的最开头,写

A = nil

然后,当程序运行时,只要它首次满足类/常量A的定义,它就会显示类似

的内容。
some_path_to_a_file:line_number in `some_method': A is not a class (TypeError)

some_path_to_a_file:line_number: warning: already initialized constant A

然后,some_path_to_a_file:line_number将成为定义A的位置。

答案 2 :(得分:0)

如果您使用的是Ruby 1.9.2,@ YenTheFirst的答案是正确的:在Method对象上调用#source_location

如果您使用的是Ruby 1.8.7,那么#source_location就不存在了。你需要类似this implementation方法的东西。 (还有一两个浮动,但我找不到另一个真快的。)