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