我有一堆代码要看,现在是调试时间.由于我从未成为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 Methods和ProcsRuby 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:
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)