自动更正
在自动更正模式下,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
建议在使用此选项时更加谨慎,并仔细审查更改。