自动更正

在自动更正模式下,RuboCop 将尝试自动修复违规。

$ rubocop -A
# or
$ rubocop --autocorrect-all

关于自动更正,需要注意以下几点。

  • 对于某些违规行为,无法实现自动更正。

  • 一些可行的自动更正尚未实现。

  • 一些自动更正可能会(略微)改变代码的语义,这意味着它们会生成与原始代码基本等效但并非完全等效的代码。我们将这种自动更正行为称为“不安全”。

使用自动更正功能后,应始终运行测试套件。

安全自动更正

$ rubocop -a
# or
$ rubocop --autocorrect

在 RuboCop 0.60 中,我们开始将警示标记为 Safe 或不安全。安全性的定义是警示不会产生误报。除此之外,还有 SafeAutoCorrect,它可能在仅警示执行的自动更正不安全但违规检测逻辑安全的情况下设置为 false。总结一下

  • Safe (true/false) - 指示警示是否会(按设计)产生误报。

  • SafeAutoCorrect (true/false) - 指示警示执行的自动更正是否按设计安全(等效)。如果警示不安全,其自动更正也会自动变为不安全。

如果警示或其自动更正被标记为“不安全”,则在使用 --autocorrect 时将被省略。

目前可能仍然存在未标记为不安全或具有不安全自动更正的警示。最终,每个警示的安全性将在默认配置中指定。

不安全警示示例

class Miner
  def dig(how_deep)
    # ...
  end
end


Miner.new.dig(42) # => Style/SingleArgumentDig
                  # => Use Miner.new[] instead of dig

这是错误的诊断;这种(人为的)dig 使用方式不是问题,可能没有替代方案。该警示被标记为 Safe: false

# example.rb:
str = 'hello' # => Missing magic comment `# frozen_string_literal: true`
str << 'world'

# autocorrects to:
# frozen_string_literal: true

str = 'hello'
str << 'world' # => now fails because `str` is frozen

# must be manually corrected to:
# frozen_string_literal: true

str = +'hello' # => We want an unfrozen string literal here...
str << 'world' # => ok

此诊断有效,因为确实缺少魔法注释(因此 Safe: true),但自动更正无效;某些字符串字面量需要以 + 为前缀,以避免它们被冻结。

要运行所有自动更正(安全和不安全)

$ rubocop -A
# or
$ rubocop --autocorrect-all

建议在使用此选项时更加谨慎,并仔细审查更改。

生成注释

$ rubocop --autocorrect --disable-uncorrectable

$ rubocop --autocorrect-all --disable-uncorrectable

您可以添加标志 --disable-uncorrectable,它将在代码中生成 # rubocop:todo 注释,以停止报告无法自动更正的违规行为。