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'在我的一个文件中使用.
请让我知道如何修复此类型和违法行为及其原因
这被标记为冒犯的原因是常量解析在词法上起作用,而不是在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.
Class类本质上是从类派生的Module,这\xe2\x80\x99s为什么Class是Module具有一些附加功能的;基本上区别在于Classes 可能会被实例化。
所以,你的问题的答案是:使用更适合你的情况的东西(根据给出的信息,不可能说出它是什么。)
\n\nrequire \'a\'与案例无关,因为require指令只是强制 ruby 解释器加载相应的代码。
注意:这类问题正是 Rubocop 抱怨的确切原因:它阻止你使用你不确定的东西并强迫你理解,是事实吗Module?Class由它\xe2\x80\x99 的本质决定。
顺便说一句,既然你提到你有require \'a\'某个地方,这可能意味着a.rb你已经module A或者class A。
BTW#2 类和模块名称都必须以大写字母开头,因为它们是常量。
\n| 归档时间: |
|
| 查看次数: |
4433 次 |
| 最近记录: |