Ruby on rails 在Ruby中自动将嵌套类转换为压缩样式

Ruby on rails 在Ruby中自动将嵌套类转换为压缩样式,ruby-on-rails,ruby,rubocop,Ruby On Rails,Ruby,Rubocop,我有一个非常大的代码库,它混合使用嵌套样式和紧凑样式来定义类 我正在构建一个自动化工具,它使用正则表达式来重新组织大量类的名称空间。当类定义是紧凑格式时,这很容易做到,但当它们是嵌套格式时,这要困难得多 因此,我需要一种将嵌套样式的所有实例转换为紧凑样式的方法 我希望RuboCop能为我做到这一点,虽然它似乎建议支持自动更正,但我无法让它工作。RuboCop报告了这些违法行为,但没有纠正 bundle exec rubocop --auto-correct app/controllers/an

我有一个非常大的代码库,它混合使用嵌套样式和紧凑样式来定义类

我正在构建一个自动化工具,它使用正则表达式来重新组织大量类的名称空间。当类定义是紧凑格式时,这很容易做到,但当它们是嵌套格式时,这要困难得多

因此,我需要一种将嵌套样式的所有实例转换为紧凑样式的方法

我希望RuboCop能为我做到这一点,虽然它似乎建议支持自动更正,但我无法让它工作。RuboCop报告了这些违法行为,但没有纠正

bundle exec rubocop --auto-correct app/controllers/announcements_controller.rb
Inspecting 1 file
C

Offenses:

app/controllers/announcements_controller.rb:1:8: C: Style/ClassAndModuleChildren: Use compact module/class definition instead of nested style.
module Vapid
       ^^^^^
app/controllers/announcements_controller.rb:2:10: C: Style/ClassAndModuleChildren: Use compact module/class definition instead of nested style.
  module V2
         ^^

1 file inspected, 2 offenses detected

如果有人能做到这一点,或者知道一种更好的自动采用紧凑型风格的方法,我将不胜感激。

简单的答案是不要这样做。你(以及那个警察的作者)做出了一个错误的假设,认为这两种“风格”实际上是做同一件事的。他们没有。后者被认为是一种非常糟糕的做法

使用显式 筑巢。使用范围解析运算符可能会导致意外的结果 由于Ruby的词法范围(取决于 模块嵌套在定义点。
-

假设你有:

module Foo
  TEST = "I'm nested in Foo"
end

module Foo
  class Bar
    puts TEST
  end
end
这将把
我嵌套在Foo
中,因为
TEST
被解析为
Foo::TEST
。允许更改类定义以使用范围解析运算符:

TEST = "I'm in the global scope"

module Foo
  TEST = "I'm nested in Foo"
end

class Foo::Bar
  puts TEST
end

这将使
我处于全局范围内
。因为模块嵌套仍然是全局范围,
TEST
解析为
::TEST
。您的小小“改进”实际上会破坏任何依赖于适当模块嵌套的代码。

您使用的是哪个版本的RuboCop?@AndyWaite
0.71.0
只想指出这两种样式并不完全相同,如果父类尚未定义,则“compact”样式将出错。您是否尝试过通过代码(例如
ObjectSpace)执行此操作。每个\u对象
遍历?
TEST = "I'm in the global scope"

module Foo
  TEST = "I'm nested in Foo"
end

class Foo::Bar
  puts TEST
end