布局
Layout/AccessModifierIndentation
Layout/ArgumentAlignment
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.68 |
0.77 |
这里我们检查多行方法定义中的参数是否对齐。
示例
Layout/ArrayAlignment
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
0.77 |
这里我们检查多行数组文字的元素是否对齐。
示例
Layout/BeginEndAlignment
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.91 |
- |
检查 begin
的结束关键字是否正确对齐。
通过 EnforcedStyleAlignWith
配置参数支持两种模式。如果设置为 start_of_line
(默认值),则 end
应与 begin
关键字所在行的开头对齐。如果设置为 begin
,则 end
应与 begin
关键字对齐。
Layout/EndAlignment
cop 默认与关键字(例如 if
、while
、case
)对齐。另一方面,此 cop 目标的 ||= begin
倾向于与行的开头对齐,它默认为 EnforcedStyleAlignWith: start_of_line
。这些样式可以通过每个 cop 进行配置。
Layout/BlockAlignment
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.53 |
- |
检查 do end 块的结束关键字是否正确对齐。
通过 EnforcedStyleAlignWith
配置参数支持三种模式
start_of_block
:end
应与 do
出现的行的开头对齐。
start_of_line
:end
应与表达式开始的行的开头对齐。
either
(默认值):end
允许在任一位置。自动修正器将默认为 start_of_line
。
Layout/CaseIndentation
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
1.16 |
检查 case
表达式的 when
和 in
相对于其 case
或 end
关键字的缩进方式。
它将为每个未对齐的 when
和 in
注册一个单独的违规。
示例
# If Layout/EndAlignment is set to keyword style (default)
# *case* and *end* should always be aligned to same depth,
# and therefore *when* should always be aligned to both -
# regardless of configuration.
# bad for all styles
case n
when 0
x * 2
else
y / 3
end
case n
in pattern
x * 2
else
y / 3
end
# good for all styles
case n
when 0
x * 2
else
y / 3
end
case n
in pattern
x * 2
else
y / 3
end
EnforcedStyle: case (默认)
# if EndAlignment is set to other style such as
# start_of_line (as shown below), then *when* alignment
# configuration does have an effect.
# bad
a = case n
when 0
x * 2
else
y / 3
end
a = case n
in pattern
x * 2
else
y / 3
end
# good
a = case n
when 0
x * 2
else
y / 3
end
a = case n
in pattern
x * 2
else
y / 3
end
Layout/ClassStructure
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已禁用 |
是 |
始终(不安全) |
0.52 |
1.53 |
检查代码风格是否遵循 ExpectedOrder 配置
Categories
允许我们将宏名称映射到类别。
考虑一个涵盖以下顺序的代码风格示例
-
模块包含(include、prepend、extend)
-
常量
-
关联(has_one、has_many)
-
公共属性宏(attr_accessor、attr_writer、attr_reader)
-
其他宏(validates、validate)
-
公共类方法
-
初始化器
-
公共实例方法
-
受保护的属性宏(attr_accessor、attr_writer、attr_reader)
-
受保护的实例方法
-
私有属性宏(attr_accessor、attr_writer、attr_reader)
-
私有实例方法
您可以配置以下顺序
Layout/ClassStructure:
ExpectedOrder:
- module_inclusion
- constants
- association
- public_attribute_macros
- public_delegate
- macros
- public_class_methods
- initializer
- public_methods
- protected_attribute_macros
- protected_methods
- private_attribute_macros
- private_delegate
- private_methods
除了将所有文字按预期顺序放置外,还可以对宏类别进行分组。可见性级别会自动处理。
Layout/ClassStructure:
Categories:
association:
- has_many
- has_one
attribute_macros:
- attr_accessor
- attr_reader
- attr_writer
macros:
- validates
- validate
module_inclusion:
- include
- prepend
- extend
示例
# bad
# Expect extend be before constant
class Person < ApplicationRecord
has_many :orders
ANSWER = 42
extend SomeModule
include AnotherModule
end
# good
class Person
# extend and include go first
extend SomeModule
include AnotherModule
# inner classes
CustomError = Class.new(StandardError)
# constants are next
SOME_CONSTANT = 20
# afterwards we have public attribute macros
attr_reader :name
# followed by other macros (if any)
validates :name
# then we have public delegate macros
delegate :to_s, to: :name
# public class methods are next in line
def self.some_method
end
# initialization goes between class methods and instance methods
def initialize
end
# followed by other public instance methods
def some_method
end
# protected attribute macros and methods go next
protected
attr_reader :protected_name
def some_protected_method
end
# private attribute macros, delegate macros and methods
# are grouped near the end
private
attr_reader :private_name
delegate :some_private_delegate, to: :name
def some_private_method
end
end
Layout/ClosingParenthesisIndentation
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
- |
检查方法调用、方法定义和分组表达式中悬挂的右括号的缩进。悬挂的右括号是指在 )
之前有换行符。
示例
# bad
some_method(
a,
b
)
some_method(
a, b
)
some_method(a, b, c
)
some_method(a,
b,
c
)
some_method(a,
x: 1,
y: 2
)
# Scenario 1: When First Parameter Is On Its Own Line
# good: when first param is on a new line, right paren is *always*
# outdented by IndentationWidth
some_method(
a,
b
)
# good
some_method(
a, b
)
# Scenario 2: When First Parameter Is On The Same Line
# good: when all other params are also on the same line, outdent
# right paren by IndentationWidth
some_method(a, b, c
)
# good: when all other params are on multiple lines, but are lined
# up, align right paren with left paren
some_method(a,
b,
c
)
# good: when other params are not lined up on multiple lines, outdent
# right paren by IndentationWidth
some_method(a,
x: 1,
y: 2
)
Layout/CommentIndentation
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
1.24 |
检查注释的缩进。
示例
# bad
# comment here
def method_name
end
# comment here
a = 'hello'
# yet another comment
if true
true
end
# good
# comment here
def method_name
end
# comment here
a = 'hello'
# yet another comment
if true
true
end
Layout/DefEndAlignment
Layout/EmptyComment
Layout/EmptyLineAfterGuardClause
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.56 |
0.59 |
强制在保护子句后使用空行。
此 cop 允许在保护子句后使用 # :nocov:
指令,因为 SimpleCov 通过将其包装在 # :nocov:
中来从覆盖率报告中排除代码。
def foo
# :nocov:
return if condition
# :nocov:
bar
end
有关更多详细信息,请参阅 SimpleCov 的文档:https://github.com/simplecov-ruby/simplecov#ignoringskipping-code
Layout/EmptyLineAfterMagicComment
Layout/EmptyLineAfterMultilineCondition
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已禁用 |
是 |
始终 |
0.90 |
- |
强制在多行条件后使用空行。
示例
# bad
if multiline &&
condition
do_something
end
# good
if multiline &&
condition
do_something
end
# bad
case x
when foo,
bar
do_something
end
# good
case x
when foo,
bar
do_something
end
# bad
begin
do_something
rescue FooError,
BarError
handle_error
end
# good
begin
do_something
rescue FooError,
BarError
handle_error
end
Layout/EmptyLineBetweenDefs
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
1.23 |
检查类/模块/方法定义之间是否用一个或多个空行隔开。
NumberOfEmptyLines
可以是整数(默认值为 1)或数组(例如 [1, 2]),以指定允许的空行数的最小值和最大值。
AllowAdjacentOneLineDefs
配置是否将相邻的一行定义视为违规。
示例
EmptyLineBetweenMethodDefs: true(默认)
# checks for empty lines between method definitions.
# bad
def a
end
def b
end
# good
def a
end
def b
end
EmptyLineBetweenClassDefs: true(默认)
# checks for empty lines between class definitions.
# bad
class A
end
class B
end
def b
end
# good
class A
end
class B
end
def b
end
EmptyLineBetweenModuleDefs: true(默认)
# checks for empty lines between module definitions.
# bad
module A
end
module B
end
def b
end
# good
module A
end
module B
end
def b
end
Layout/EmptyLines
Layout/EmptyLinesAroundAccessModifier
Layout/EmptyLinesAroundAttributeAccessor
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.83 |
0.84 |
检查属性访问器或一组属性访问器之后是否有换行符。默认情况下允许alias
语法和alias_method
、public
、protected
和private
方法。这些可以通过AllowAliasSyntax
和AllowedMethods
选项进行自定义。
示例
# bad
attr_accessor :foo
def do_something
end
# good
attr_accessor :foo
def do_something
end
# good
attr_accessor :foo
attr_reader :bar
attr_writer :baz
attr :qux
def do_something
end
Layout/EmptyLinesAroundClassBody
Layout/EmptyLinesAroundExceptionHandlingKeywords
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
- |
检查begin
部分体周围是否存在空行。此 cop 不检查begin
体开头/结尾和方法定义体周围的空行。Style/EmptyLinesAroundBeginBody
或Style/EmptyLinesAroundMethodBody
可用于此目的。
Layout/EmptyLinesAroundModuleBody
布局/结束对齐
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.53 |
- |
检查结束关键字是否正确对齐。
通过 EnforcedStyleAlignWith
配置参数支持三种模式
如果设置为 keyword
(默认值),则 end
应与关键字的开头对齐(例如,if、class 等)。
如果设置为 variable
,则 end
应与变量赋值的左侧对齐,如果有的话。
如果设置为 start_of_line
,则 end
应与匹配关键字出现的行的开头对齐。
此 Layout/EndAlignment
规则默认情况下与关键字(例如 if
、while
、case
)对齐。另一方面,Layout/BeginEndAlignment
规则默认情况下与 EnforcedStyleAlignWith: start_of_line
对齐,因为 ||= begin
倾向于与行的开头对齐。Layout/DefEndAlignment
规则默认情况下也与 EnforcedStyleAlignWith: start_of_line
对齐。这些样式可以通过每个规则进行配置。
布局/行尾
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
否 |
0.49 |
- |
检查源代码中是否存在 Windows 风格的行尾。
示例
EnforcedStyle: native(默认)
# The `native` style means that CR+LF (Carriage Return + Line Feed) is
# enforced on Windows, and LF is enforced on other platforms.
# bad
puts 'Hello' # Return character is LF on Windows.
puts 'Hello' # Return character is CR+LF on other than Windows.
# good
puts 'Hello' # Return character is CR+LF on Windows.
puts 'Hello' # Return character is LF on other than Windows.
布局/额外空格
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
- |
检查是否存在额外/不必要的空格。
示例
# good if AllowForAlignment is true
name = "RuboCop"
# Some comment and an empty line
website += "/rubocop/rubocop" unless cond
puts "rubocop" if debug
# bad for any configuration
set_app("RuboCop")
website = "https://github.com/rubocop/rubocop"
# good only if AllowBeforeTrailingComments is true
object.method(arg) # this is a comment
# good even if AllowBeforeTrailingComments is false or not set
object.method(arg) # this is a comment
# good with either AllowBeforeTrailingComments or AllowForAlignment
object.method(arg) # this is a comment
another_object.method(arg) # this is another comment
some_object.method(arg) # this is some comment
Layout/FirstArgumentIndentation
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.68 |
0.77 |
检查方法调用中第一个参数的缩进。第一个参数之后的参数由 Layout/ArgumentAlignment
检查,而不是由这个 cop 检查。
要缩进方法 *定义* 的第一个参数,请查看 Layout/FirstParameterIndentation
。
这个 cop 将尊重 Layout/ArgumentAlignment
,并且当 Layout/ArgumentAlignment
指定 EnforcedStyle: with_fixed_indentation
时将不起作用。
示例
# bad
some_method(
first_param,
second_param)
foo = some_method(
first_param,
second_param)
foo = some_method(nested_call(
nested_first_param),
second_param)
foo = some_method(
nested_call(
nested_first_param),
second_param)
some_method nested_call(
nested_first_param),
second_param
EnforcedStyle: special_for_inner_method_call_in_parentheses (默认)
# Same as `special_for_inner_method_call` except that the special rule
# only applies if the outer method call encloses its arguments in
# parentheses.
# good
some_method(
first_param,
second_param)
foo = some_method(
first_param,
second_param)
foo = some_method(nested_call(
nested_first_param),
second_param)
foo = some_method(
nested_call(
nested_first_param),
second_param)
some_method nested_call(
nested_first_param),
second_param
EnforcedStyle: consistent
# The first argument should always be indented one step more than the
# preceding line.
# good
some_method(
first_param,
second_param)
foo = some_method(
first_param,
second_param)
foo = some_method(nested_call(
nested_first_param),
second_param)
foo = some_method(
nested_call(
nested_first_param),
second_param)
some_method nested_call(
nested_first_param),
second_param
EnforcedStyle: consistent_relative_to_receiver
# The first argument should always be indented one level relative to
# the parent that is receiving the argument
# good
some_method(
first_param,
second_param)
foo = some_method(
first_param,
second_param)
foo = some_method(nested_call(
nested_first_param),
second_param)
foo = some_method(
nested_call(
nested_first_param),
second_param)
some_method nested_call(
nested_first_param),
second_params
EnforcedStyle: special_for_inner_method_call
# The first argument should normally be indented one step more than
# the preceding line, but if it's a argument for a method call that
# is itself a argument in a method call, then the inner argument
# should be indented relative to the inner method.
# good
some_method(
first_param,
second_param)
foo = some_method(
first_param,
second_param)
foo = some_method(nested_call(
nested_first_param),
second_param)
foo = some_method(
nested_call(
nested_first_param),
second_param)
some_method nested_call(
nested_first_param),
second_param
Layout/FirstArrayElementIndentation
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.68 |
0.77 |
检查数组字面量中第一个元素的缩进,其中左括号和第一个元素在不同的行上。其他元素的缩进由 Layout/ArrayAlignment
cop 处理。
这个 cop 将尊重 Layout/ArrayAlignment
,并且当 Layout/ArrayAlignment
指定 EnforcedStyle: with_fixed_indentation
时将不起作用。
默认情况下,在带括号的方法调用中作为参数的数组字面量,以及数组的左方括号与方法调用的左括号在同一行上的数组字面量,其第一个元素应缩进比左括号内的位置多一步(两个空格)。
其他数组字面量应将其第一个元素缩进比左方括号所在行的开头多一步。
此默认样式称为“special_inside_parentheses”。其他样式是“consistent”和“align_brackets”。以下是示例
示例
EnforcedStyle: special_inside_parentheses (默认)
# The `special_inside_parentheses` style enforces that the first
# element in an array literal where the opening bracket and first
# element are on separate lines is indented one step (two spaces) more
# than the position inside the opening parenthesis.
# bad
array = [
:value
]
and_in_a_method_call([
:no_difference
])
# good
array = [
:value
]
but_in_a_method_call([
:its_like_this
])
EnforcedStyle: consistent
# The `consistent` style enforces that the first element in an array
# literal where the opening bracket and the first element are on
# separate lines is indented the same as an array literal which is not
# defined inside a method call.
# bad
# consistent
array = [
:value
]
but_in_a_method_call([
:its_like_this
])
# good
array = [
:value
]
and_in_a_method_call([
:no_difference
])
Layout/FirstArrayElementLineBreak
Layout/FirstHashElementIndentation
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.68 |
0.77 |
检查在哈希文字中第一个键的缩进,其中开括号和第一个键位于不同的行上。其他键的缩进由 HashAlignment cop 处理。
默认情况下,在带括号的方法调用中作为参数的哈希文字,以及哈希的开括号与方法调用的开括号位于同一行的哈希文字,其第一个键的缩进应比开括号内的位置多一步(两个空格)。
其他哈希文字的第一个键的缩进应比开括号所在行的开头多一步。
此默认样式称为“special_inside_parentheses”。其他样式包括“consistent”和“align_braces”。以下是一些示例
示例
EnforcedStyle: special_inside_parentheses(默认)
# The `special_inside_parentheses` style enforces that the first key
# in a hash literal where the opening brace and the first key are on
# separate lines is indented one step (two spaces) more than the
# position inside the opening parentheses.
# bad
hash = {
key: :value
}
and_in_a_method_call({
no: :difference
})
takes_multi_pairs_hash(x: {
a: 1,
b: 2
},
y: {
c: 1,
d: 2
})
# good
special_inside_parentheses
hash = {
key: :value
}
but_in_a_method_call({
its_like: :this
})
takes_multi_pairs_hash(x: {
a: 1,
b: 2
},
y: {
c: 1,
d: 2
})
EnforcedStyle: consistent
# The `consistent` style enforces that the first key in a hash
# literal where the opening brace and the first key are on
# separate lines is indented the same as a hash literal which is not
# defined inside a method call.
# bad
hash = {
key: :value
}
but_in_a_method_call({
its_like: :this
})
# good
hash = {
key: :value
}
and_in_a_method_call({
no: :difference
})
EnforcedStyle: align_braces
# The `align_brackets` style enforces that the opening and closing
# braces are indented to the same position.
# bad
and_now_for_something = {
completely: :different
}
takes_multi_pairs_hash(x: {
a: 1,
b: 2
},
y: {
c: 1,
d: 2
})
# good
and_now_for_something = {
completely: :different
}
takes_multi_pairs_hash(x: {
a: 1,
b: 2
},
y: {
c: 1,
d: 2
})
Layout/FirstHashElementLineBreak
Layout/FirstMethodArgumentLineBreak
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已禁用 |
是 |
始终 |
0.49 |
- |
检查多行方法调用中第一个参数之前的换行符。
示例
# bad
method(foo, bar,
baz)
# good
method(
foo, bar,
baz)
# ignored
method foo, bar,
baz
Layout/FirstMethodParameterLineBreak
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已禁用 |
是 |
始终 |
0.49 |
- |
检查多行方法参数定义中第一个参数之前的换行符。
示例
# bad
def method(foo, bar,
baz)
do_something
end
# good
def method(
foo, bar,
baz)
do_something
end
# ignored
def method foo,
bar
do_something
end
Layout/FirstParameterIndentation
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
0.77 |
检查方法定义中第一个参数的缩进。第一个参数之后的参数由 Layout/ParameterAlignment 检查,而不是由此 cop 检查。
要缩进方法调用的第一个参数,请查看 Layout/FirstArgumentIndentation,它支持与方法定义无关的嵌套选项。
Layout/HashAlignment
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
1.16 |
检查多行哈希文字的键、分隔符和值是否根据配置对齐。配置选项是
-
key (左对齐键,哈希火箭和值之前有一个空格)
-
separator (对齐哈希火箭和冒号,右对齐键)
-
table (左对齐键、哈希火箭和值)
还可以配置作为方法调用最后一个参数传递的哈希的处理方式。选项是
-
always_inspect
-
always_ignore
-
ignore_implicit (没有花括号)
或者,您可以指定多个允许的样式。这可以通过将样式列表传递给 EnforcedStyles 来完成。
示例
EnforcedHashRocketStyle: key (默认)
# bad
{
:foo => bar,
:ba => baz
}
{
:foo => bar,
:ba => baz
}
# good
{
:foo => bar,
:ba => baz
}
EnforcedHashRocketStyle: separator
# bad
{
:foo => bar,
:ba => baz
}
{
:foo => bar,
:ba => baz
}
# good
{
:foo => bar,
:ba => baz
}
EnforcedColonStyle: key (默认)
# bad
{
foo: bar,
ba: baz
}
{
foo: bar,
ba: baz
}
# good
{
foo: bar,
ba: baz
}
EnforcedLastArgumentHashStyle: always_inspect (默认)
# Inspect both implicit and explicit hashes.
# bad
do_something(foo: 1,
bar: 2)
# bad
do_something({foo: 1,
bar: 2})
# good
do_something(foo: 1,
bar: 2)
# good
do_something(
foo: 1,
bar: 2
)
# good
do_something({foo: 1,
bar: 2})
# good
do_something({
foo: 1,
bar: 2
})
EnforcedLastArgumentHashStyle: always_ignore
# Ignore both implicit and explicit hashes.
# good
do_something(foo: 1,
bar: 2)
# good
do_something({foo: 1,
bar: 2})
Layout/HeredocArgumentClosingParenthesis
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已禁用 |
是 |
始终 |
0.68 |
- |
检查在将 HEREDOC 字符串作为参数传递给方法调用时,闭合括号的位置。它应该放在包含打开 HEREDOC 标签的行末尾。
Layout/HeredocIndentation
必需的 Ruby 版本:2.3 |
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
0.85 |
检查 here document 主体的缩进。主体缩进一个步骤。
注意:当 Layout/LineLength
的 AllowHeredoc
为 false(非默认值)时,此 cop 不会为长 here document 添加任何违规,以避免 Layout/LineLength
的违规。
Layout/IndentationConsistency
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
- |
检查不一致的缩进。
indented_internal_methods
和 normal
之间的区别在于,indented_internal_methods
样式规定,在类和模块中,protected
和 private
修饰符关键字应与公共方法缩进相同,并且受保护和私有成员应比修饰符缩进一个步骤。除此之外,两种样式都意味着相同逻辑深度的实体应具有相同的缩进。
示例
强制样式:normal(默认)
# bad
class A
def test
puts 'hello'
puts 'world'
end
end
# bad
class A
def test
puts 'hello'
puts 'world'
end
protected
def foo
end
private
def bar
end
end
# good
class A
def test
puts 'hello'
puts 'world'
end
end
# good
class A
def test
puts 'hello'
puts 'world'
end
protected
def foo
end
private
def bar
end
end
强制样式:indented_internal_methods
# bad
class A
def test
puts 'hello'
puts 'world'
end
end
# bad
class A
def test
puts 'hello'
puts 'world'
end
protected
def foo
end
private
def bar
end
end
# good
class A
def test
puts 'hello'
puts 'world'
end
end
# good
class A
def test
puts 'hello'
puts 'world'
end
protected
def foo
end
private
def bar
end
end
Layout/IndentationStyle
Layout/IndentationWidth
Layout/LeadingCommentSpace
Layout/LineContinuationLeadingSpace
Layout/LineEndStringConcatenationIndentation
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
待定 |
是 |
始终 |
1.18 |
- |
检查以字符串文字和反斜杠结尾的行后面的下一行的缩进。
如果设置了EnforcedStyle: aligned
,则连接的字符串部分应与第一部分对齐。 有一些例外,例如隐式返回值,无论EnforcedStyle
配置如何,连接的字符串部分都应缩进。
如果设置了EnforcedStyle: indented
,则第二行应比第一行多缩进一步。 第 3 行及以后的行应与第 2 行对齐。
示例
# bad
def some_method
'x' \
'y' \
'z'
end
my_hash = {
first: 'a message' \
'in two parts'
}
# good
def some_method
'x' \
'y' \
'z'
end
Layout/LineLength
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.25 |
1.4 |
检查源代码中行的长度。 最大长度是可配置的。 制表符大小在Layout/IndentationStyle
cop 的IndentationWidth
中配置。 它还默认忽略 shebang 行。
此 cop 具有某些自动更正功能。 它可以通过在可以安全地跨行拆分的表达式中插入换行符来以编程方式缩短某些长行。 这些包括数组、哈希和带有参数列表的方法调用。
如果启用了自动更正,则建议使用以下 Layout cop 来进一步格式化断开的行。(其中许多默认情况下已启用。)
-
ArgumentAlignment
-
ArrayAlignment
-
BlockAlignment
-
BlockDelimiters
-
BlockEndNewline
-
ClosingParenthesisIndentation
-
FirstArgumentIndentation
-
FirstArrayElementIndentation
-
FirstHashElementIndentation
-
FirstParameterIndentation
-
HashAlignment
-
IndentationWidth
-
MultilineArrayLineBreaks
-
MultilineBlockLayout
-
MultilineHashBraceLayout
-
MultilineHashKeyLineBreaks
-
MultilineMethodArgumentLineBreaks
-
MultilineMethodParameterLineBreaks
-
ParameterAlignment
这些 cop 共同将格式化哈希、数组、方法调用等。 例如,假设最大列数为 25
示例
# bad
{foo: "0000000000", bar: "0000000000", baz: "0000000000"}
# good
{foo: "0000000000",
bar: "0000000000", baz: "0000000000"}
# good (with recommended cops enabled)
{
foo: "0000000000",
bar: "0000000000",
baz: "0000000000",
}
Layout/MultilineArrayBraceLayout
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
- |
检查数组字面量的结束大括号是否在与最后一个数组元素相同的行上或新行上。
使用 symmetrical
(默认)样式时
如果数组的开始大括号与数组的第一个元素在同一行上,则结束大括号应与数组的最后一个元素在同一行上。
如果数组的开始大括号在第一个元素的上一行,则结束大括号应在最后一个元素的下一行。
使用 new_line
样式时
多行数组字面量的结束大括号必须在数组最后一个元素的下一行。
使用 same_line
样式时
多行数组字面量的结束大括号必须与最后一个数组元素在同一行。
Layout/MultilineArrayLineBreaks
Layout/MultilineAssignmentLayout
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已禁用 |
是 |
始终 |
0.49 |
- |
检查多行赋值在赋值运算符之后是否有换行符。
Layout/MultilineBlockLayout
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
- |
检查多行 do end 块的起始行之后是否包含换行符。此外,它还会检查块参数(如果有)是否与块的起始行位于同一行。如果将块参数放在单独的行上,因为整行否则会太长,则可以接受。
Layout/MultilineHashBraceLayout
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
- |
检查哈希文字中的结束大括号是否与最后一个哈希元素位于同一行,或者位于新行。
使用 symmetrical
(默认)样式时
如果哈希的开始大括号与哈希的第一个元素位于同一行,则结束大括号应与哈希的最后一个元素位于同一行。
如果哈希的开始大括号位于第一个元素的上一行,则结束大括号应位于最后一个元素的下一行。
使用 new_line
样式时
多行哈希文字的结束大括号必须位于哈希最后一个元素的下一行。
使用 same_line
样式时
多行哈希文字的结束大括号必须与哈希最后一个元素位于同一行。
Layout/MultilineHashKeyLineBreaks
Layout/MultilineMethodArgumentLineBreaks
Layout/MultilineMethodCallBraceLayout
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
- |
检查方法调用中的闭合大括号是否与最后一个方法参数位于同一行,或位于新行。
使用 symmetrical
(默认)样式时
如果方法调用的左大括号与调用的第一个参数位于同一行,则闭合大括号应与调用的最后一个参数位于同一行。
如果方法调用的左大括号位于第一个参数所在行的上一行,则闭合大括号应位于最后一个参数所在行的下一行。
使用 new_line
样式时
多行方法调用的闭合大括号必须位于调用最后一个参数所在行的下一行。
使用 same_line
样式时
多行方法调用的闭合大括号必须与调用最后一个参数位于同一行。
Layout/MultilineMethodCallIndentation
Layout/MultilineMethodDefinitionBraceLayout
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
- |
检查方法定义中的闭合大括号是否与最后一个方法参数位于同一行,或位于新行。
使用 symmetrical
(默认)样式时
如果方法定义的左大括号与定义的第一个参数位于同一行,则闭合大括号应与定义的最后一个参数位于同一行。
如果方法定义的左大括号位于第一个参数所在行的上一行,则闭合大括号应位于最后一个参数所在行的下一行。
使用 new_line
样式时
多行方法定义的闭合大括号必须位于定义最后一个参数所在行的下一行。
使用 same_line
样式时
多行方法定义的闭合大括号必须与定义最后一个参数位于同一行。
Layout/MultilineMethodParameterLineBreaks
Layout/MultilineOperationIndentation
Layout/ParameterAlignment
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
0.77 |
在这里,我们检查多行方法调用或定义中的参数是否对齐。
要设置第一个参数的对齐方式,请使用 cop FirstParameterIndentation。
示例
Layout/RedundantLineBreak
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已禁用 |
是 |
始终 |
1.13 |
- |
检查某些表达式(例如方法调用)是否不必要地被分解成多行,而这些表达式可以完全放在一行上。
Layout/SpaceAfterColon
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
- |
检查冒号 (:) 后面是否没有空格。注意,此 cop 不处理三元运算符后的空格,这些空格由 Layout/SpaceAroundOperators 处理。
Layout/SpaceAroundBlockParameters
Layout/SpaceAroundEqualsInParameterDefault
Layout/SpaceAroundOperators
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
- |
检查运算符周围是否有空格,除了 **,它应该或不应该有周围的空格,具体取决于配置。它允许在运算符周围进行垂直对齐,包括一个或多个空格。
此 cop 有 AllowForAlignment
选项。当 true
时,允许大多数使用额外的空格,如果目的是与前一行或下一行的运算符对齐,不包括空行或注释行。
示例
# bad
total = 3*4
"apple"+"juice"
my_number = 38/4
# good
total = 3 * 4
"apple" + "juice"
my_number = 38 / 4
Layout/SpaceBeforeBlockBraces
Layout/SpaceInLambdaLiteral
Layout/SpaceInsideArrayLiteralBrackets
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.52 |
- |
检查用于数组文字的括号是否根据配置有或没有周围的空格。
示例
EnforcedStyle: no_space (默认)
# The `no_space` style enforces that array literals have
# no surrounding space.
# bad
array = [ a, b, c, d ]
# good
array = [a, b, c, d]
EnforcedStyle: space
# The `space` style enforces that array literals have
# surrounding space.
# bad
array = [a, b, c, d]
# good
array = [ a, b, c, d ]
EnforcedStyle: compact
# The `compact` style normally requires a space inside
# array brackets, with the exception that successive left
# or right brackets are collapsed together in nested arrays.
# bad
array = [ a, [ b, c ] ]
array = [
[ a ],
[ b, c ]
]
# good
array = [ a, [ b, c ]]
array = [[ a ],
[ b, c ]]
Layout/SpaceInsideBlockBraces
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
- |
检查块括号根据配置是否有或没有周围的空格。对于接受参数的块,它会根据配置检查左括号是否有或没有尾随空格。
示例
EnforcedStyle: space(默认)
# The `space` style enforces that block braces have
# surrounding space.
# bad
some_array.each {puts e}
# good
some_array.each { puts e }
EnforcedStyle: no_space
# The `no_space` style enforces that block braces don't
# have surrounding space.
# bad
some_array.each { puts e }
# good
some_array.each {puts e}
EnforcedStyleForEmptyBraces: no_space(默认)
# The `no_space` EnforcedStyleForEmptyBraces style enforces that
# block braces don't have a space in between when empty.
# bad
some_array.each { }
some_array.each { }
some_array.each { }
# good
some_array.each {}
EnforcedStyleForEmptyBraces: space
# The `space` EnforcedStyleForEmptyBraces style enforces that
# block braces have at least a space in between when empty.
# bad
some_array.each {}
# good
some_array.each { }
some_array.each { }
some_array.each { }
Layout/SpaceInsideHashLiteralBraces
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
- |
检查用于哈希字面量的括号根据配置是否有或没有周围的空格。
示例
EnforcedStyle: space(默认)
# The `space` style enforces that hash literals have
# surrounding space.
# bad
h = {a: 1, b: 2}
# good
h = { a: 1, b: 2 }
EnforcedStyle: no_space
# The `no_space` style enforces that hash literals have
# no surrounding space.
# bad
h = { a: 1, b: 2 }
# good
h = {a: 1, b: 2}
EnforcedStyle: compact
# The `compact` style normally requires a space inside
# hash braces, with the exception that successive left
# braces or right braces are collapsed together in nested hashes.
# bad
h = { a: { b: 2 } }
foo = { { a: 1 } => { b: { c: 2 } } }
# good
h = { a: { b: 2 }}
foo = {{ a: 1 } => { b: { c: 2 }}}
Layout/SpaceInsideParens
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
1.22 |
检查普通圆括号内的空格。
示例
EnforcedStyle: no_space(默认)
# The `no_space` style enforces that parentheses do not have spaces.
# bad
f( 3)
g = (a + 3 )
f( )
# good
f(3)
g = (a + 3)
f()
EnforcedStyle: space
# The `space` style enforces that parentheses have a space at the
# beginning and end.
# Note: Empty parentheses should not have spaces.
# bad
f(3)
g = (a + 3)
y( )
# good
f( 3 )
g = ( a + 3 )
y()
EnforcedStyle: compact
# The `compact` style enforces that parentheses have a space at the
# beginning with the exception that successive parentheses are allowed.
# Note: Empty parentheses should not have spaces.
# bad
f(3)
g = (a + 3)
y( )
g( f( x ) )
g( f( x( 3 ) ), 5 )
g( ( ( 3 + 5 ) * f) ** x, 5 )
# good
f( 3 )
g = ( a + 3 )
y()
g( f( x ))
g( f( x( 3 )), 5 )
g((( 3 + 5 ) * f ) ** x, 5 )
Layout/SpaceInsideReferenceBrackets
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.52 |
0.53 |
检查引用括号是否根据配置有或没有周围空格。
示例
EnforcedStyle: no_space(默认)
# The `no_space` style enforces that reference brackets have
# no surrounding space.
# bad
hash[ :key ]
array[ index ]
# good
hash[:key]
array[index]
EnforcedStyle: space
# The `space` style enforces that reference brackets have
# surrounding space.
# bad
hash[:key]
array[index]
# good
hash[ :key ]
array[ index ]
Layout/SpaceInsideStringInterpolation
Layout/TrailingEmptyLines
Layout/TrailingWhitespace
默认启用 | 安全 | 支持自动更正 | 添加版本 | 更改版本 |
---|---|---|---|---|
已启用 |
是 |
始终 |
0.49 |
1.0 |
查找源代码中的尾随空格。
示例
# The line in this example contains spaces after the 0.
# bad
x = 0
# The line in this example ends directly after the 0.
# good
x = 0
AllowMultilineFinalElement
AllowMultilineFinalElement
是一个布尔选项(默认情况下为 false
),它在以下 Layout 规则中可用
-
FirstArrayElementLineBreak
-
FirstHashElementLineBreak
-
FirstMethodArgumentLineBreak
-
FirstMethodParameterLineBreak
-
MultilineArrayLineBreaks
-
MultilineHashKeyLineBreaks
-
MultilineMethodArgumentLineBreaks
-
MultilineMethodParameterLineBreaks
这些警察会忽略它们各自的表达式,如果所有或表达式的元素都在同一行。如果将 AllowMultilineFinalElement
设置为 true
,警察也会忽略多行表达式,如果最后一个元素从同一行开始,但在不同的行结束。
这与 Layout/LineLength
很好地配合使用,以便在换行时将元素显示在单独的行上,同时不会影响已经足够短的表达式,并且仅因其最后一个元素而被认为是多行。
每个警察都可以独立配置,允许对代码库中被认为是好的 ok 的内容进行更细粒度的控制。
示例
以下是一些现实世界中表达式的示例,这些表达式被它们各自的警察包装,但在将 AllowMultilineFinalElement
设置为 true
时被认为是 ok 的。
# good
# FirstArrayElementLineBreak and MultilineArrayLineBreaks
# Array of error containing a single error
errors = [{
error: "Something went wrong",
error_code: error_code,
}]
# Array of flags, with last flag computed
flags = [:a, :b, foo(
bar,
baz
)]
# FirstHashElementLineBreak and MultilineHashKeyLineBreaks
hash = { foo: 1, bar: 2, baz: {
c: 1,
d: 2
}}
# FirstMethodArgumentLineBreak and MultilineMethodArgumentLineBreaks
single_argument_hash_method_call({
a: 1,
b: 2,
c: 3
})
# Call some method, with a long last argument, that is a hash
write_log(:error, {
"job_class" => job.class.name,
"resource" => resource.id,
"message" => "Something wrong happened here",
})
# Rails before action with long last argument
before_action :load_something, only: [
:show,
:list,
:some_other_long_action_name,
]
# Rails validation with inline callback
validate :name, presence: true, on: [:create, :activate], if: -> {
active? && some_relationship.any?
}
# Rails after commit hook, with some Sorbet bindings
after_commit :geolocate, unless: -> {
T.bind(self, Address)
archived? || invalid?
}
# FirstMethodParameterLineBreak and MultilineMethodParameterLineBreaks
# Method with a long last parameter default value
def foo(foo, bar, baz = {
a: 1,
b: 2,
c: 3
})
do_something
end