【问题标题】:See where a symbol is defined in irb查看 irb 中定义符号的位置
【发布时间】:2012-04-13 16:32:44
【问题描述】:

我在工作中从事一个相当大的 Rails 项目。有时我需要寻找类/常量定义。 Ruby 中是否有一些内置方法可以为我执行此操作?示例:

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

【问题讨论】:

  • 您是否尝试过在您的目录中搜索“SOME_CONSTANT =”?

标签: ruby-on-rails ruby irb


【解决方案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 个方法的类。不过,它不适用于常量。

【讨论】:

    【解决方案2】:

    在加载任何文件之前的最开始,插入一行定义您想要检查的类/常量,而不是模块。例如,假设您的代码中有类或其他类型的常量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 的位置。

    【讨论】:

      【解决方案3】:

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

      如果您使用的是 Ruby 1.8.7,那么#source_location 不存在(目前)。您将需要类似this implementation 的方法。 (还有一两个漂浮在周围,但我不能很快找到另一个)。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 2013-11-23
      相关资源
      最近更新 更多