【问题标题】:How to fix rubocop offense for a class class a::b::c如何修复类 a::b::c 的 rubocop 攻击
【发布时间】:2016-04-11 12:20:45
【问题描述】:

我有以下文件 lib/a/b/c.rb

class a::b::c
  def request(env)
    #some code here
  end
end

现在我使用的是 rubocop 风格

Style/ClassAndModuleChildren:
  Enabled: true

我因此受到了 rubocop 的冒犯

lib/a/b/c.rb:1:7: C: Use nested module/class definitions instead of compact style.
class a::b::c

当我将代码更新为以下攻击时得到修复

样式一

class a
  class b
    class c
      def request(env)
        #some code here
      end
    end
  end
end

样式 2

module a
  module b
    class c
      def request(env)
        #some code here
      end
    end
  end
end

我认为我应该使用Style 2,因为我在我的一个文件中使用require 'a'

请告诉我如何解决这种类型和违规行为以及原因

【问题讨论】:

    标签: ruby ruby-on-rails-3 class module rubocop


    【解决方案1】:

    Class 类本质上是从Module 类派生的,这就是为什么Class 是具有一些附加功能的Module;基本上区别在于Classes 可能会被实例化。

    因此,您的问题的答案是:使用更适合您的情况(并且根据给出的信息无法说出它是什么。)

    require 'a' 与案例无关,因为require 指令只是强制 ruby​​ 解释器加载相应的代码。

    注意: 这类问题正是 Rubocop 抱怨的原因:它阻止你使用你不确定的东西并强迫你理解,实际上是 Module,还是Class 天生如此。

    顺便说一句,既然你提到你在某处有require 'a',这可能意味着在这个a.rb 中你已经有module Aclass A

    BTW#2 类名和模块名都必须以大写字母开头,因为它们是常量

    【讨论】:

      【解决方案2】:

      这被标记为冒犯的原因是常量解析在词法上起作用,而不是在 ruby​​ 中的语义上。这不直观,可能会导致一些晦涩的错误(例如,如果您在两个不同的范围内有两个同名的类)。比较这两种情况:

      # Given
      module Foo
        X = 42
      end
      
      # This
      module Foo
        class Bar
          def baz
            puts X
          end
        end
      end
      
      # VS
      class Foo::Bar
        def baz
          puts X
        end
      end
      

      现在当你打电话时:

      Foo::Bar.new.baz
      

      在第一种情况下,您将获得42,在第二种情况下 - NameError: uninitialized constant Foo::Bar::X


      至于修复它的正确方法是:请注意,如果Foo 尚不存在,则使用短语法会给您一个错误。答案是 - 你应该使用 Foo 是什么。如果是类 - 使用 class,如果是模块 - module

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-24
        • 2013-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-15
        • 2019-11-25
        • 2021-04-09
        相关资源
        最近更新 更多