【发布时间】:2017-05-25 21:00:43
【问题描述】:
我们进行了一项测试,发现应用程序中的每个 Ruby 文件并对其运行 ruby -c。我们引入了Rubocop 并使其检查相同的文件列表。
运行 ruby -c 的测试现在实际上是无用的,还是有一个失败模式的示例会被 ruby -c 捕获但 Rubocop 没有?
ruby -c 的文档说:
导致 Ruby 检查脚本的语法并退出而不执行。如果没有语法错误,Ruby 会在标准输出中打印“Syntax OK”。
这是一个语法问题的示例,将被以下任一者捕获:
% echo "puts 'hello world" > hot_script.rb
% ruby -c hot_script.rb
hot_script.rb:1: unterminated string meets end of file
% rubocop hot_script.rb
Inspecting 1 file
F
Offenses:
hot_script.rb:1:6: F: unterminated string meets end of file
(Using Ruby 1.9 parser; configure using TargetRubyVersion parameter, under AllCops)
puts 'hello world
^
1 file inspected, 1 offense detected
Rubocop 甚至捕获了一些相同的警告,尽管我之前没有配置 ruby -c 来捕获这些警告,因此我对错误更感兴趣。以下是处理警告时的相对奇偶性示例:
% cat unused_var.rb
def hot_method
a = 1
b = 2
puts b
end
% ruby -cwW2 unused_var.rb
unused_var.rb:2: warning: assigned but unused variable - a
Syntax OK
% rubocop unused_var.rb
Inspecting 1 file
W
Offenses:
unused_var.rb:2:3: W: Lint/UselessAssignment: Useless assignment to variable - a.
a = 1
^
1 file inspected, 1 offense detected
我搜索过
- https://www.google.com/search?q=rubocop%20syntax%20check%20superset
- https://www.google.com/search?q=is%20there%20any%20reason%20to%20run%20ruby%20-c%20syntax%20check%20if%20i%20use%20rubocop
但我可能做错了。 Ruby 1.9 中的测试比 Ruby 1.8 中的要慢得多,所以这个问题的答案对我来说实际上很有价值。而且你不得不承认,你很好奇,对吧?
【问题讨论】:
-
Rubocop 检查最佳实践、行长和复杂性,
ruby -c不会做的事情。文档说“开箱即用,它将强制执行社区Ruby Style Guide 中概述的许多准则。”使用ruby -cwW2会更全面,因为它会警告未使用的变量,这对于捕获拼写错误的变量名称很有用。 -
铁皮人是最红的!我会接受这个作为答案,即使我对实际的语法错误反例特别感兴趣,但我添加了一个示例,显示 rubocop 这些天实际上正在捕获一些未使用的变量问题。