我现在使用以下来检查语法错误:
system "ruby -wc path/to/file.rb"
但是如果文件太多(例如,我的重构代码),则非常浪费时间,所以我的问题是:是否有办法在ruby代码中进行ruby语法检查?
答案 0 :(得分:6)
在MRI下,你可以使用RubyVM::InstructionSequence#compile
(relevant documentation)来编译Ruby代码(如果有错误会抛出异常):
2.1.0 :001 > RubyVM::InstructionSequence.compile "a = 1 + 2"
=> <RubyVM::InstructionSequence:<compiled>@<compiled>>
2.1.0 :002 > RubyVM::InstructionSequence.compile "a = 1 + "
<compiled>:1: syntax error, unexpected end-of-input
a = 1 +
^
SyntaxError: compile error
from (irb):2:in `compile'
from (irb):2
from /usr/local/rvm/rubies/ruby-2.1.0/bin/irb:11:in `<main>'
答案 1 :(得分:3)
我的经验是,检查我的代码是否正确编译的最简单方法是运行自动化测试。无论是编译运行测试还是只检查文件在词法上是否正确,编译器都会做同样的工作。
MRI的解析器是用C语言编写的。我无法找到如何访问它的具体参考,但我确信有一种方法可以做到这一点。如果只有人花了一些时间让Ruby更容易识别Ruby ......
在Rubinius,可以通过墨尔本直接访问解析器:
rbx-2.2.10 :039 > Rubinius::ToolSets::Runtime::Melbourne.parse_file("./todo.txt")
SyntaxError: expecting keyword_do or '{' or '(': ./todo.txt:2:17
和有效的ruby文件:
rbx-2.2.10 :044 > Rubinius::ToolSets::Runtime::Melbourne.parse_file('./valid.rb')
=> #<Rubinius::ToolSets::Runtime::AST::Class:0x1e6b4 @name=# <Rubinius::ToolSets::Runtime::AST::ClassName:0x1e6b8 @name=:RubyStuff @line=1 @superclass=#<Rubinius::ToolSets::Runtime::AST::NilLiteral:0x1e6bc @line=1>> @body=#<Rubinius::ToolSets::Runtime::AST::EmptyBody:0x1e6c8 @line=1> @line=1 @superclass=#<Rubinius::ToolSets::Runtime::AST::NilLiteral:0x1e6bc @line=1>>
您目前正在使用命令行工具来解析ruby。如果您正在使用Ruby中的文件进行循环,也许您应该将其带到命令行并执行以下操作:
jw@logopolis:/projects/open/compile-test$ find . | grep ".rb$" | xargs ruby -c
Syntax OK
jw@logopolis:/projects/open/compile-test$ find . | grep ".rb$" | xargs ruby -c
./invalid.rb:2: expecting $end: ./invalid.rb:2:3
在Ruby中看起来像这样:
system "find . | grep ".rb$" | xargs ruby -c"
答案 2 :(得分:1)
最简单的方法是使用命令行 -c
标志:
ruby -c file_you_want_to_check.rb
答案 3 :(得分:0)
您可以使用Ripper,Ruby解析器的Ruby接口: