【问题标题】:Is Rubocop a superset of the "ruby -c" syntax check?Rubocop 是“ruby -c”语法检查的超集吗?
【发布时间】: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

我搜索过

但我可能做错了。 Ruby 1.9 中的测试比 Ruby 1.8 中的要慢得多,所以这个问题的答案对我来说实际上很有价值。而且你不得不承认,你很好奇,对吧?

【问题讨论】:

  • Rubocop 检查最佳实践、行长和复杂性,ruby -c 不会做的事情。文档说“开箱即用,它将强制执行社区Ruby Style Guide 中概述的许多准则。”使用ruby -cwW2 会更全面,因为它会警告未使用的变量,这对于捕获拼写错误的变量名称很有用。
  • 铁皮人是最红的!我会接受这个作为答案,即使我对实际的语法错误反例特别感兴趣,但我添加了一个示例,显示 rubocop 这些天实际上正在捕获一些未使用的变量问题。

标签: ruby rubocop


【解决方案1】:

答案是“大多数时候”。 RuboCop 建立在 parser gem 之上,这是一个独立的 Ruby 解析器,或多或少地模仿了 MRI 解析器。 RuboCop 封装了解析器的语法检查,并将正确报告问题。但是,正如解析器的 GitHub 上所述:

不幸的是,MRI 经常在补丁级别版本中更改语法 [...] 没有简单的方法可以跟踪这些变化。

这个政策使得 Parser 几乎不可能精确 与 Ruby MRI 解析器兼容。

此外,解析器支持您正在使用的任何版本的最新次要版本,并且不会向后移植次要版本。因此,如果您使用 Ruby 2.4.0,RuboCop 将使用支持 2.4.1 语法的解析器版本。

就所有意图和目的而言,解析器等同于官方 MRI 解析器,除非您有特定理由同时使用两者,否则单独使用 RuboCop 就足够了。

【讨论】:

  • 我对这两个答案都投了赞成票。我接受这个,因为它更精确。
【解决方案2】:

Rubocop 还会识别和报告语法错误,因为如果出现这种情况,代码将无法正确解析,因此两者都不需要。

【讨论】:

  • 这是我的轶事经验。但出于某种原因,我不想相信这是真的,并认为有人会想出一个例子来说明 ruby​​ -c 的优势所在。如果一两天没人做,我一定会接受的,谢谢!
  • @burnettk 这在理论上是可能的,但这将是一个错误。此外,任何通过的解析错误都会被您的测试套件捕获,因为测试无法在可解析的代码上运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 2014-06-01
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 1970-01-01
相关资源
最近更新 更多