从类对象获取类位置

Har*_*ina 37 ruby

我有一堆代码要看,现在是调试时间.由于我从未成为Ruby调试器的粉丝,因此我正在寻找一种通过代码并阅读它的方法.

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

Foo::Bar.create(:param) # how can I know file location in runtime?
Run Code Online (Sandbox Code Playgroud)

对于规模较小,组织较好的项目,我只会搜索,class Bar但这里不可能,因为有很多类命名Bar,更糟糕的是,其中一些属于同一名称空间.我知道,等待发生的麻烦.

注意:我使用的是Ruby 1.8.7.

Laa*_*aas 34

For MethodsProcsRuby 1.9有一个名为source_location的方法:

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

所以你可以请求方法:

m = Foo::Bar.method(:create)
Run Code Online (Sandbox Code Playgroud)

然后询问source_location该方法:

m.source_location
Run Code Online (Sandbox Code Playgroud)

这将返回一个包含文件名和行号的数组.例如,ActiveRecord::Base#validates这个回报:

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]
Run Code Online (Sandbox Code Playgroud)

对于类和模块,Ruby不提供内置支持,但是source_location如果没有指定方法,那么有一个优秀的Gist可用于返回给定方法的文件或类的第一个文件:

编辑:对于Ruby 1.8.7,有一个gem backports source_location:

  • 用您正在编写的语言了解调试器是一项非常重要的技能.我教给我工作的人,因为它可以让你深入了解你的代码在做什么,以及它是我遇到问题时需要知道的第一个工具,需要知道在哪里以及为什么. (2认同)

ill*_*ist 17

仅供参考,在Rails的控制台或Rails应用程序的调试会话中,您可以找到定义该特定类的文件的磁盘位置.喜欢

> show-source Job
Run Code Online (Sandbox Code Playgroud)

这会给你

From: /home/john/projects/iisifix/app/models/job.rb @ line 13:
Class name: Job
Number of monkeypatches: 6. Use the `-a` option to display all available monkeypatches
Number of lines: 66

class Job < ApplicationRecord
  belongs_to :quote_request
  belongs_to :garage
Run Code Online (Sandbox Code Playgroud)


Con*_*che 15

查找函数.source_location:​

> ActiveModel.method(:as_json).source_location
["/usr/local/bundle/gems/activesupport-6.1.4.4/lib/active_support/core_ext/object/json.rb", 54]
Run Code Online (Sandbox Code Playgroud)

要查找模块 Object.const_source_location

Object.const_source_location('ActiveModel')
["/usr/local/bundle/gems/activemodel-6.1.4.4/lib/active_model/gem_version.rb", 3]
Run Code Online (Sandbox Code Playgroud)

  • 这应该是 2022 年公认的答案! (2认同)