我有一大堆代码要看,现在是调试时间.因为我从来都不喜欢Ruby的调试器,所以我正在寻找一种方法来阅读代码.

我想做的是获取定义加载类的文件的位置:

Foo::Bar.create(:param) # how can I know file location in runtime?

对于更小、组织更好的项目,我只需要搜索class Bar个,但在这里这是不可能的,因为有许多名为Bar的类,更糟糕的是,其中一些类位于同一名称空间下.我知道,等待发生是件麻烦事.

注意:我使用的是Ruby 1.8.7.

推荐答案

对于MethodsProcs,Ruby 1.9的方法称为source_location:

返回包含此方法的Ruby源文件名和行号,如果此方法未在Ruby中定义(即本机),则返回nil

因此,您可以申请该方法:

m = Foo::Bar.method(:create)

然后询问该方法的source_location:

m.source_location

这将返回一个带有文件名和行号的array.

ActiveRecord::Base.method(:validates).source_location
# => ["/Users/laas/.rvm/gems/ruby-1.9.2-p0@arveaurik/gems/activemodel-3.2.2/lib/active_model/validations/validates.rb", 81]

对于类和模块,Ruby不提供内置支持,但有一个很好的要点,即在source_location的基础上为给定的方法返回文件,或者在没有指定方法的情况下为类返回第一个文件:

EDIT:对于Ruby 1.8.7,有一个支持source_location的gem:

Ruby相关问答推荐

如何保证散列中的对象不完全相同

使用 Ruby 仅删除数组中的特定重复项

是否有类似于 Ruby 的 Sinatra 的 .NET 框架?

C# 中的 typeof 保留字是否有 Ruby 类似功能?

何时在 Ruby 方法中使用 `self.foo` 而不是 `foo`

如何在新行之间拆分字符串并保留空白行?

Ruby检测方法

需要Ruby

Ruby 哈希文字的顺序是否得到保证?

如何从 Gemfile 安装 gem?

加载 RubyGems 插件时出错,openssl.bundle (LoadError)

如何将 STDOUT 捕获到字符串?

用反斜杠单引号替换单引号

通过 x 个字符在 Ruby 中获取子字符串

判断ruby中的字符长度

如何在 Ruby 中编写复杂的多行 if 条件?

如何在没有警告的情况下重新定义 Ruby 常量?

Ruby 中的自然语言处理

什么是 Rakefile?

如何在器上下文中运行 ruby​​ 脚本?