1

我有一个名为的方法$muffinize,我想在我的代码中找到它。换句话说,给定以下代码:

class A
    def foo
        $muffinize(1)
    end
    def bar
        ...
    end
end

class B
    def shoop
        $muffinize(2)
    end
    def woop
        ...
    end
end

class C
    def nope
        ...
    end
end

我希望结果是(写入文件):

A:foo
B:shoop

我正在考虑使用正则表达式来完成此任务,但我想知道是否有某种方法可以通过 Ruby 元编程(我可能不小心将其用作流行词)来完成此任务?

4

3 回答 3

2

Kernel.caller() 将帮助您显示在运行时调用它的行号和方法。如果您puts caller(1,1)在 muffinize 函数中放置类似的内容,它将输出这些位置,但前提是它们在运行时被调用。

如果要进行离线源代码分析,则需要使用https://github.com/whitequark/parser之类的东西来解析 AST(抽象语法树) 。

这是 ripper 的一个快速示例(内置于新的 rubies 中) - 这不是严格意义上的 AST,但它也不是提取类

#!/usr/local/env ruby

require 'ripper'
#require 'pry'

contents = File.open('example.rb').read

code = Ripper.lex(contents)
code.each do |line|
    if(line[1] == :on_ident and line[2] == "muffinize")
        puts "muffinize found at line #{line.first.first}"
    end
end
于 2013-09-09T06:04:11.137 回答
0

忽略您的代码在语法上甚至无效的事实,这根本不可能。

这是一个简单的例子:

class A
  def foo
    bar
    muffinize(1)
  end
end

A#fooObject#muffinize当且仅当bar终止时才会调用。这意味着弄清楚是否A#foo调用Object#muffinize需要解决停止问题。

于 2013-09-09T13:08:01.703 回答
0

通过通过 获取类和方法的列表,ri然后我能够分析每个方法以使用method_sourcegem 检索它们的源代码,然后搜索muffinize. 这并不排除muffinize出现在评论或字符串中的可能性,但我认为这种情况发生的可能性小到可以忽略。

于 2013-09-09T06:04:28.767 回答