如何从给定代码快速分析代码定义

dos*_*123 2 ruby rubygems ruby-on-rails

假设我是一个非常庞大的项目,我很好奇这条线是如何工作的:

authorize! :read_pipeline_schedule, user_project
Run Code Online (Sandbox Code Playgroud)

authorize!应该是方法名称.它是类中的私有函数,还是从父块提供的DSL,包含或在gem中声明的?或者也许没有?

我使用grep来查找内部代码,使用Google来获取外部代码,例如gems,但是我想如果我能看到方法的调用堆栈,它会很有用.puts caller虽然它不能用于分析上述情况,但是从我所在的地方打印.

我想知道最好的做法.

Ser*_*sev 6

您可以grep您的代码并安装宝石,如果名称足够独特,您将快速找到它的定义和相关的用法.但是,如果名称是常见名称call,那么这种方法就没用了.

Ruby是一种动态语言,因此是静态分析的噩梦.你可能在那里这从何而来,但你无法知道肯定.

唯一知道的方法是运行时内省.因此,在您的示例中,在该行之前放置一个断点

binding.pry
authorize! :read_pipeline_schedule, user_project
Run Code Online (Sandbox Code Playgroud)

你会辍学pry.现在你可以做到

show-source authorize!
Run Code Online (Sandbox Code Playgroud)

并查看这个方法的确切位置.