命名
命名/访问器方法名
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
否 |
0.50 |
- |
确保访问器方法的命名正确。适用于实例方法和类方法。
仅为具有预期参数数量的方法注册违规。Getter(get_attribute )必须没有参数才能注册,Setter(set_attribute(value) )必须恰好有一个参数。
|
命名/ASCII标识符
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
否 |
0.50 |
0.87 |
检查标识符和常量名称中的非ASCII字符。始终检查标识符,是否检查常量可以通过AsciiConstants配置控制。
示例
# bad
def καλημερα # Greek alphabet (non-ascii)
end
# bad
def こんにちはと言う # Japanese character (non-ascii)
end
# bad
def hello_🍣 # Emoji (non-ascii)
end
# good
def say_hello
end
# bad
신장 = 10 # Hangul character (non-ascii)
# good
height = 10
# bad
params[:عرض_gteq] # Arabic character (non-ascii)
# good
params[:width_gteq]
命名/块转发
命名/块参数名
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
否 |
0.53 |
0.77 |
检查块参数名描述性。高度可配置。
MinNameLength
配置选项接受整数。它表示名称的最小字符数。默认值为 1。AllowNamesEndingInNumbers
配置选项接受布尔值。设置为 false 时,此 cop 将为以数字结尾的名称注册违规。默认值为 false。AllowedNames
配置选项接受允许的名称数组,这些名称永远不会注册违规。ForbiddenNames
配置选项接受受限名称数组,这些名称将始终注册违规。
示例
# bad
bar do |varOne, varTwo|
varOne + varTwo
end
# With `AllowNamesEndingInNumbers` set to false
foo { |num1, num2| num1 * num2 }
# With `MinNameLength` set to number greater than 1
baz { |a, b, c| do_stuff(a, b, c) }
# good
bar do |thud, fred|
thud + fred
end
foo { |speed, distance| speed * distance }
baz { |age, height, gender| do_stuff(age, height, gender) }
命名/类和模块驼峰式命名法
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
否 |
0.50 |
0.85 |
检查类和模块名称中是否有下划线。
AllowedNames
配置接受允许的名称数组。其默认值为 ['module_parent']
。这些名称可以是完整的类/模块名称或名称的一部分。例如,将 my_class
添加到 AllowedNames
配置将允许诸如 my_class
、my_class::User
、App::my_class
、App::my_class::User
等名称。
命名/文件名
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
否 |
0.50 |
1.23 |
确保 Ruby 源文件使用蛇形命名法。
此 cop 还忽略 .gemspec
文件,因为 Bundler 建议在嵌套 gem 中使用连字符来分隔命名空间(例如 bundler-console
变成 Bundler::Console
)。因此,gemspec 应该命名为 bundler-console.gemspec
。
当 ExpectMatchingDefinition
(默认:false
)为 true
时,该规则要求每个文件都包含一个与文件名匹配的类、模块或 Struct
定义。这可以通过使用 CheckDefinitionPathHierarchy
(默认:true
)进一步配置,以确定路径是否应与上述定义的命名空间匹配。
当 IgnoreExecutableScripts
(默认:true
)为 true
时,以 Shebang 行开头的文件不会被该规则考虑。
当设置 Regex
时,该规则将标记任何不匹配正则表达式的文件名。
示例
# bad
lib/layoutManager.rb
anything/usingCamelCase
# good
lib/layout_manager.rb
anything/using_snake_case.rake
可配置属性
名称 | 默认值 | 可配置值 |
---|---|---|
排除 |
|
数组 |
ExpectMatchingDefinition |
|
布尔值 |
CheckDefinitionPathHierarchy |
|
布尔值 |
CheckDefinitionPathHierarchyRoots |
|
数组 |
Regex |
|
|
IgnoreExecutableScripts |
|
布尔值 |
AllowedAcronyms |
|
数组 |
命名/Heredoc分隔符大小写
命名/Heredoc分隔符命名
命名/包容性语言
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已禁用 |
是 |
始终 |
1.18 |
1.49 |
建议使用包容性语言,而不是有问题的术语。该检查器可以检查以下位置以查找违规行为
-
标识符
-
常量
-
变量
-
字符串
-
符号
-
注释
-
文件路径
每个位置都可以通过配置单独启用/禁用,例如 CheckIdentifiers = true/false。
标记的术语可配置。对于每个标记的术语,可以指定一个可选的正则表达式来识别违规行为。可以配置替换标记术语的建议,并将显示为违规消息的一部分。可以为标记的术语指定一个 AllowedRegex 来免除该术语的允许使用。WholeWord: true
可以设置在标记的术语上,以指示检查器应该只在术语匹配整个单词时匹配(部分匹配将不会是违规行为)。
当只有一个建议时,该检查器支持自动更正。当有多个建议时,无法识别最佳建议,并且不会自动更正。
示例
FlaggedTerms: { whitelist: { Suggestions: ['allowlist'] } }
# Suggest replacing identifier whitelist with allowlist
# bad
whitelist_users = %w(user1 user1)
# good
allowlist_users = %w(user1 user2)
FlaggedTerms: { master: { Suggestions: ['main', 'primary', 'leader'] } }
# Suggest replacing master in an instance variable name with main, primary, or leader
# bad
@master_node = 'node1.example.com'
# good
@primary_node = 'node1.example.com'
FlaggedTerms: { whitelist: { Regex: !ruby/regexp '/white[-_\s]?list' } }
# Identify problematic terms using a Regexp
# bad
white_list = %w(user1 user2)
# good
allow_list = %w(user1 user2)
可配置属性
名称 | 默认值 | 可配置值 |
---|---|---|
CheckIdentifiers |
|
布尔值 |
CheckConstants |
|
布尔值 |
CheckVariables |
|
布尔值 |
CheckStrings |
|
布尔值 |
CheckSymbols |
|
布尔值 |
CheckComments |
|
布尔值 |
CheckFilepaths |
|
布尔值 |
FlaggedTerms |
|
命名/记忆实例变量名称
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
否 |
始终(不安全) |
0.53 |
1.2 |
检查记忆方法,其实例变量名称与方法名称不匹配。适用于常规方法(使用def
定义)和动态方法(使用define_method
或define_singleton_method
定义)。
此代码可以与 EnforcedStyleForLeadingUnderscores 指令一起配置。它可以配置为允许以下划线开头的已记忆实例变量。以下划线为前缀的 ivar 是一种约定,用于隐式指示 ivar 不应在记忆方法之外设置或引用。
示例
EnforcedStyleForLeadingUnderscores:不允许(默认)
# bad
# Method foo is memoized using an instance variable that is
# not `@foo`. This can cause confusion and bugs.
def foo
@something ||= calculate_expensive_thing
end
def foo
return @something if defined?(@something)
@something = calculate_expensive_thing
end
# good
def _foo
@foo ||= calculate_expensive_thing
end
# good
def foo
@foo ||= calculate_expensive_thing
end
# good
def foo
@foo ||= begin
calculate_expensive_thing
end
end
# good
def foo
helper_variable = something_we_need_to_calculate_foo
@foo ||= calculate_expensive_thing(helper_variable)
end
# good
define_method(:foo) do
@foo ||= calculate_expensive_thing
end
# good
define_method(:foo) do
return @foo if defined?(@foo)
@foo = calculate_expensive_thing
end
EnforcedStyleForLeadingUnderscores:必需
# bad
def foo
@something ||= calculate_expensive_thing
end
# bad
def foo
@foo ||= calculate_expensive_thing
end
def foo
return @foo if defined?(@foo)
@foo = calculate_expensive_thing
end
# good
def foo
@_foo ||= calculate_expensive_thing
end
# good
def _foo
@_foo ||= calculate_expensive_thing
end
def foo
return @_foo if defined?(@_foo)
@_foo = calculate_expensive_thing
end
# good
define_method(:foo) do
@_foo ||= calculate_expensive_thing
end
# good
define_method(:foo) do
return @_foo if defined?(@_foo)
@_foo = calculate_expensive_thing
end
EnforcedStyleForLeadingUnderscores:可选
# bad
def foo
@something ||= calculate_expensive_thing
end
# good
def foo
@foo ||= calculate_expensive_thing
end
# good
def foo
@_foo ||= calculate_expensive_thing
end
# good
def _foo
@_foo ||= calculate_expensive_thing
end
# good
def foo
return @_foo if defined?(@_foo)
@_foo = calculate_expensive_thing
end
# good
define_method(:foo) do
@foo ||= calculate_expensive_thing
end
# good
define_method(:foo) do
@_foo ||= calculate_expensive_thing
end
命名/方法名称
命名/方法参数名称
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
否 |
0.53 |
0.77 |
检查方法参数名称的描述性。它高度可配置。
MinNameLength
配置选项接受一个整数。它表示名称必须具有的最小字符数。它的默认值为 3。AllowNamesEndingInNumbers
配置选项接受一个布尔值。当设置为 false 时,此代码将为以数字结尾的名称注册违规。它的默认值为 false。AllowedNames
配置选项接受一个允许的名称数组,这些名称永远不会注册违规。ForbiddenNames
配置选项接受一个受限名称数组,这些名称将始终注册违规。
示例
# bad
def bar(varOne, varTwo)
varOne + varTwo
end
# With `AllowNamesEndingInNumbers` set to false
def foo(num1, num2)
num1 * num2
end
# With `MinNameLength` set to number greater than 1
def baz(a, b, c)
do_stuff(a, b, c)
end
# good
def bar(thud, fred)
thud + fred
end
def foo(speed, distance)
speed * distance
end
def baz(age_a, height_b, gender_c)
do_stuff(age_a, height_b, gender_c)
end
命名/谓词名称
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
否 |
0.50 |
0.77 |
检查谓词方法名称是否以问号结尾,并且不以禁止的前缀开头。
如果方法名称以 NamePrefix
配置中定义的前缀之一开头,则该方法被确定为谓词方法。您可以通过更改此选项来更改被视为前缀的内容。cop 要求任何以这些前缀之一开头的名称的结尾必须是 ?
。可以通过添加到 AllowedMethods
配置中来允许其他方法。
is_a? 方法默认情况下是允许的。
|
如果设置了 ForbiddenPrefixes
,则以配置的前缀开头的将不被允许,并将被自动更正删除。
换句话说,如果 ForbiddenPrefixes
为空,则名为 is_foo
的方法只会因为缺少问号而注册违规(并将被自动更正为 is_foo?
)。如果 ForbiddenPrefixes
包含 is_
,则 is_foo
将因为缺少问号和 is_
前缀而注册违规,并将被更正为 foo?
。
ForbiddenPrefixes 仅应用于 NamePrefix 中的前缀;前者中存在但后者中不存在的前缀将不被此 cop 考虑。
|
示例
# bad
def is_even(value)
end
def is_even?(value)
end
# good
def even?(value)
end
# bad
def has_value
end
def has_value?
end
# good
def value?
end
命名/已救援异常变量名称
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.67 |
0.68 |
确保已救援异常变量的命名符合预期。
PreferredName
配置选项接受一个 String
。它表示变量的所需名称。它的默认值为 e
。
此 cop 不考虑嵌套救援,因为它无法保证外部救援中的变量不会在内部救援中使用(在这种情况下,更改内部变量会遮蔽外部变量)。 |
命名/变量编号
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
否 |
0.50 |
1.4 |
确保所有编号变量使用配置的样式,snake_case、normalcase 或 non_integer,作为其编号。
此外,CheckMethodNames
和 CheckSymbols
配置选项可用于指定是否应检查方法名称和符号。两者默认情况下都已启用。
示例
强制样式:normalcase(默认)
# bad
:some_sym_1
variable_1 = 1
def some_method_1; end
def some_method1(arg_1); end
# good
:some_sym1
variable1 = 1
def some_method1; end
def some_method1(arg1); end
强制样式:snake_case
# bad
:some_sym1
variable1 = 1
def some_method1; end
def some_method_1(arg1); end
# good
:some_sym_1
variable_1 = 1
def some_method_1; end
def some_method_1(arg_1); end
强制样式:non_integer
# bad
:some_sym1
:some_sym_1
variable1 = 1
variable_1 = 1
def some_method1; end
def some_method_1; end
def some_methodone(arg1); end
def some_methodone(arg_1); end
# good
:some_symone
:some_sym_one
variableone = 1
variable_one = 1
def some_methodone; end
def some_method_one; end
def some_methodone(argone); end
def some_methodone(arg_one); end
# In the following examples, we assume `EnforcedStyle: normalcase` (default).