2011-06-16 62 views
9

Nokogiri非常棒。我可以做像#css('.bla')这样的事情,它会返回第一个匹配的元素。解析Ruby代码有没有类似于Nokogiri?

现在我们需要对Ruby源代码进行一些解析 - 查找类中的所有方法等等。我们使用的是ruby_parser gem,但它所做的只是梳理源代码并吐出S表达式。对于这些S表达式,有没有像Nokogiri这样的事情可以做到这样的事情:“返回S表达式找到名为'foo'的第一个方法”?

+2

你真的需要解析吗?正如nash提到的,用ruby元编程不能做什么。 – Schmurfy 2011-06-18 16:59:53

+1

即使你可以,那也不会告诉你任何动态定义的方法,例如'define_method(“foo _#{bar}”)'' – Gareth 2011-06-18 21:14:21

回答

0

我不知道关于你正在寻找的宝石什么,但你可以找到使用instance_methods一个类中的所有方法:

class Foo 
    def bar 
    end 
end 

irb(main):005:0> Foo.instance_methods - Object.instance_methods 
=> [:bar] 
0

你可以检查rubinius解析器,它可以帮助你做你想做的事。

2

虽然我接受Jörg的答案,因为它更完整,但我最终发现了一些我最终使用的东西。 ruby_parser会安装一个名为sexp_processor的依赖gem(它在这个实际定义了Sexp类的gem中)。如果您查看class docs,有几个方法可以帮助您使用基本的Ruby查找器。这里有一个例子:

class Sexp 
    def name   # convenience method 
    self.sexp_body.first 
    end 
end  

# Print out all instance methods within classes. Beware - if "code" sexp itself 
# is a class, it will NOT be included! 
code = RubyParser.new.parse(IO.read('/src/file')) 
code.each_of_type(:class){ |klass| 
    klass.each_of_type(:defn){ |meth| 
    puts meth.name 
    } 
} 
相关问题