如何修复类a :: b :: c的rubocop攻击

Sal*_*lil 7 ruby module class ruby-on-rails-3 rubocop

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

class a::b::c
  def request(env)
    #some code here
  end
end
Run Code Online (Sandbox Code Playgroud)

现在我使用的是rubocop风格

Style/ClassAndModuleChildren:
  Enabled: true
Run Code Online (Sandbox Code Playgroud)

我为此获得了rubocop的进攻

lib/a/b/c.rb:1:7: C: Use nested module/class definitions instead of compact style.
class a::b::c
Run Code Online (Sandbox Code Playgroud)

当我更新我的代码到以下的攻击得到修复

风格1

class a
  class b
    class c
      def request(env)
        #some code here
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

风格2

module a
  module b
    class c
      def request(env)
        #some code here
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我想我应该使用Style 2我require 'a'在我的一个文件中使用.

请让我知道如何修复此类型和违法行为及其原因

ndn*_*kov 7

这被标记为冒犯的原因是常量解析在词法上起作用,而不是在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
Run Code Online (Sandbox Code Playgroud)

现在你打电话的时候:

Foo::Bar.new.baz
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,你会得到42,在第二种情况下-NameError: uninitialized constant Foo::Bar::X


至于哪个是修正它的正确方法:请注意,如果Foo不存在,使用短语法将给出错误.答案是 - 你应该使用任何东西Foo.如果它是一个类 - 使用class,如果它是一个模块 - module.


Ale*_*kin 4

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

\n\n

所以,你的问题的答案是:使用更适合你的情况的东西(根据给出的信息,不可能说出它是什么。)

\n\n

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

\n\n

注意:这类问题正是 Rubocop 抱怨的确切原因:它阻止你使用你不确定的东西并强迫你理解,是事实吗Module?Class由它\xe2\x80\x99 的本质决定。

\n\n

顺便说一句,既然你提到你有require \'a\'某个地方,这可能意味着a.rb你已经module A或者class A。

\n\n

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

\n