如何找到 Ruby 中定义常量的位置?

问题描述 投票:0回答:6

使用

pry
,可以非常简单地找到定义方法的位置并通过
edit-method
命令查看源代码。然而,阶级本身没有对应关系。当该类没有自己定义方法时,很难通过
pry
找到来源。

类是常量,因此相当于询问在哪里可以找到定义特定 Ruby 常量的源代码。非常感谢。

ruby constants
6个回答
21
投票

从 Ruby 2.7 开始,有更好的方法可以做到这一点,即

Module.const_source_location

> Admin.const_source_location(:LIMIT)
#=> ["SOME_PATH/user.rb", 2]

参考资料:

来自@ulysse-bn的奖金:

要快速访问此方法,您可以将其添加到 IRB 配置中,如下所示:

  • ~/.irbrc
# displays path of constant
#
# Usage:
#
#     _source_location(::ActiveRecord::Base)
#
def _source_location(const)
  Object.const_source_location(const.name)
end

19
投票

在 ruby 中,

$"
保存通过
Kernel.load
加载的所有文件名。 所以你可以尝试这样的事情:

constant = User
$".detect{|load_path|
  load_path.include?(constant.to_s.underscore)
}

注意:方法

underscore
是Rails/ActiveSupport

的一部分

8
投票

使用ack,有时如果我达到了 Pry(和 Ruby)的极限,我就会求助于使用它。它的优点是您可以使用其 shell 集成功能从 Pry 本身内部调用它,通常只需键入

.ack ClassName
即可达到目的,但是它要求该类在当前目录下的文件中定义。

如果该类未在当前目录中定义,那么您始终可以查找其方法之一,从那里获取源位置,然后使用 Pry 的 cat 命令显示它(带有语法突出显示) ) 或 Pry 的 edit 命令直接跳转到其定义。

类没有定义任何实例方法的情况相当罕见——而且这样的类通常很无趣:)

编辑

最新版本的 Pry (0.9.9) 现在可以使用普通的

show-source
命令显示模块/类的源代码。然而,它要求模块/类至少有一个定义的方法


5
投票

用于调试目的的一种巧妙方法:启动控制台(例如使用

binding.irb
)并重新定义常量。您将收到一条错误消息,其中包含先前的定义路径!

> Foo = ""
(irb):11: warning: already initialized constant Foo
/path/to/foo.rb:1: warning: previous definition of Foo was here
=> ""

4
投票

如果您要查找的常量具有方法(是类或模块),您可以使用 Method 类来查找它的定义位置。

class Foo
  def bar
  end

  def self.baz
  end
end

Foo.instance_method(:bar).source_location
Foo.method(:baz).source_location

有点 hack,对纯常量没有帮助

class Foo; BAHZ = 2; end
但总比没有好。


2
投票

好吧,您可以尝试

Module.constants(true)
,如此处所述,它可能比使用
pry
提供的内容多一点,但它会让您有机会了解所涉及的模块

© www.soinside.com 2019 - 2024. All rights reserved.