【发布时间】:2012-04-13 16:32:44
【问题描述】:
我在工作中从事一个相当大的 Rails 项目。有时我需要寻找类/常量定义。 Ruby 中是否有一些内置方法可以为我执行此操作?示例:
irb> SOME_CONSTANT.__file__
=> /some/path/to/a/file
【问题讨论】:
-
您是否尝试过在您的目录中搜索“SOME_CONSTANT =”?
标签: ruby-on-rails ruby irb
我在工作中从事一个相当大的 Rails 项目。有时我需要寻找类/常量定义。 Ruby 中是否有一些内置方法可以为我执行此操作?示例:
irb> SOME_CONSTANT.__file__
=> /some/path/to/a/file
【问题讨论】:
标签: ruby-on-rails ruby irb
这并不完全是您要寻找的,但是方法确实 上有一个 .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 个方法的类。不过,它不适用于常量。
【讨论】:
在加载任何文件之前的最开始,插入一行定义您想要检查的类/常量,而不是模块。例如,假设您的代码中有类或其他类型的常量A,并且想知道它的定义位置。然后,在主文件的最开始,写
A = nil
那么,当程序运行时,每当它第一次遇到class/constant 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 的位置。
【讨论】:
如果您使用的是 Ruby 1.9.2,@YenTheFirst 的答案是正确的:在 Method 对象上调用 #source_location。
如果您使用的是 Ruby 1.8.7,那么#source_location 不存在(目前)。您将需要类似this implementation 的方法。 (还有一两个漂浮在周围,但我不能很快找到另一个)。
【讨论】:
Method#source_location。