节点类型

这是一个由 AST 解析的节点类型以及与其关联的方法和信息的列表。

RuboCop::AST::Node 通过为某些节点类型提供单独的类来定义一些其他方法。您可以在 API 文档 中查看方法定义。

有关完整信息,请参阅 解析器文档。此页面将作为该页面的快速索引,该页面包含更多示例和对不同位置部分的更完整解释。您还可以通过运行 ruby-parse --legacy -L -e "ruby(code: 'here')" 来查看自己的完整 AST。

在描述中会提到一些节点的“元类型”。

  • 表达式节点:任何返回值的表达式 - 变量(lvarivarcvar 等)、sendcsendconstself、任何字面量值(intstrnil 等)或控制语句,如 ifcasebegin 等。

  • 赋值节点:任何赋值的节点。lvasgnivasgncvasgngvasgnsend(例如 self.foo = 5)或 csend

  • 主体语句:这基本上可以是任何节点,除了必须嵌套的节点(如 argsmlhs)。通常它作为可以包含任意代码的节点(如 defclass)的子节点出现。这将始终是一个单个节点,它要么是表达式,要么是 begin 节点,要么是 nil

位置信息

您可以通过在节点上调用 .loc 来获取源映射的不同部分。每个节点都有一个 expression 值,它通常代表整个节点,但其他节点有额外的字段。

以下字段在与源代码中的节点相关时给出

字段

描述

assoc

在 rescue 子句(resbody)的主体中使用的胖箭头:,不在哈希 pair 中)

begin

  • 圆括号或方括号的开始 ([

  • do..end 块的开始(包含 do 关键字)

  • then 关键字

  • begin 关键字

  • 字面量中的第一个符号(如字符串的 " 或符号的 :

colon

: 符号,用作三元运算符的一部分(:

dot

用于 sendcsend 节点的 .&. 运算符。

double_colon

:: 运算符

else

elseelsif 关键字

end

  • 圆括号或方括号的结束 )]

  • end 关键字

  • 字面量中的最后一个符号(如字符串的 "

heredoc_body

heredoc 格式字符串的主体。

heredoc_end

heredoc 语句的结束。

in

in 关键字(如 for..in 中)

keyword

任何基于文本的关键字,如 beginand,除了由其他字段处理的其他关键字。这将包括包含关键字的完整字符串。

name

定义某些内容时使用(如 constarg)。

operator

任何代表运算符的符号,如 *(splat)或 ||=

问题

? 符号用作三元运算符 (if) 的一部分

选择器

用于方法调用 (send / csend) 或实际上是方法的运算符 (如 +)

节点类型

类型 描述 子节点 示例 节点类

别名

方法别名

两个子节点 - 都是 symdsymgvar 节点。

alias :foo :bar

AliasNode

与运算符

两个子节点都是表示操作数的表达式节点。

a and b && c

AndNode

and_asgn

与赋值 (将接收者与参数进行与运算,并将结果赋值回接收者)。

第一个子节点必须是赋值节点,第二个子节点是表达式节点。

a &&= b

AndAsgnNode

arg

必需的位置参数。必须位于 args 中。

一个子节点 - 一个符号,代表参数名称。

def foo(bar)

ArgNode

args

参数列表。必须位于 defdefsdef_edefs_eblock 节点中。

子节点必须是 argoptargrestargblockargkwargkwoptargkwrestargkwnilargforwardarg

def whatever(foo, bar=1, baz: 5)

ArgsNode

array

数组字面量。

数组中的值,包括可能的 splat

[1, 2, 3]

ArrayNode

back_ref

正则表达式反向引用,例如 $&。

一个子节点 (符号) 代表引用名称,例如 :$&

re = /foo(abc)/; $&

N/A

block

块执行。

三个子节点。第一个子节点是接收者 **或** lambda 节点;第二个子节点是 argsforward_args (仅当 emit_forward 为假时;默认情况下为真);第三个子节点是主体语句。

foo.bar do |a, b|; puts a; end

BlockNode

block_pass

在将块作为参数传递时使用。

一个子节点,一个表达式节点,代表要传递的块。

foo(a, &my_block)

N/A

blockarg

对函数定义中块参数的引用。必须位于 args 中。

一个子节点 - 一个符号,代表参数名称。

def foo(&bar)

ArgNode

break

break 关键字

一个子节点,包含一个表达式节点,用于传递要通过 break 传递的结果。

break 1

BreakNode

case

Case 语句。

第一个子节点是用于检查条件的表达式节点。最后一个子节点是用于“else”条件的表达式节点。所有中间节点都是when节点。

case a; when 1; b; when 2; c; else d; end

CaseNode

casgn

常量赋值

三个子节点:父对象(表达式、nilcbase)、常量名称(符号)和被赋值的表达式。

Foo::Bar = 5

CasgnNode

cbase

表示顶级模块常量(即常量名称之前的'::')。仅在const节点内出现。

::Foo

N/A

complex

复数字面量

一个子节点,即复数值

1i

N/A

const

常量引用。

两个子节点,父对象(表达式、nilcbase)和常量名称(符号)。

AModule::AClass

N/A

class

类定义

三个子节点。第一个子节点是用于类名称的const节点,第二个子节点是用于父名称的const节点或nil,第三个子节点是主体语句。

class Foo < Bar; end

ClassNode

csend

空安全方法调用,即使用&.

第一个子节点是接收者节点(例如self),第二个子节点是方法名称(例如:foo=),其余子节点(如果有)是表示参数的节点。

foo&.bar

SendNode

cvar

类变量访问

一个子节点,即变量名称:@@cfoo

@@cfoo

N/A

cvasgn

类变量赋值

两个子节点:变量名称:@@foo和被赋值的表达式

@@foo = 5

AsgnNode

def

实例方法定义(完整格式)

三个子节点。第一个子节点是方法的名称(符号);第二个子节点是argsforward_args(仅当emit_forward为假时,默认情况下为真),最后一个子节点是主体语句。

def foo(some_arg, kwarg: 1); end

DefNode

defined?

defined? 关键字。

一个子节点,一个表达式。

defined?(foo)

N/A

defs

单例方法定义(完整格式) - 即在单个对象上定义方法。

四个子节点。第一个子节点是接收者;第二个子节点是方法名称(符号);第三个子节点是 argsforward_args(仅当 emit_forward 为假时,默认情况下为真),第四个子节点是主体语句。

def some_obj.foo(some_arg, kwarg: 1); end

DefNode

dstr

插值字符串字面量。

子节点被分成 str 节点,插值由单独的表达式节点表示。

"foo#{bar}baz"

StrNode

dsym

插值符号字面量。

子节点被分成 str 节点,插值由单独的表达式节点表示。

:"foo#{bar}baz"

N/A

ensure

包含 ensure 和可能的 rescue 的块。必须位于 defdefsblockbegin 内部。

最后一个子节点是 ensure 块的主体语句。如果有 rescue,它是第一个子节点(并包含顶层块的主体语句);否则,第一个子节点是顶层块的主体语句。

begin; foo; rescue Exception; bar; ensure; baz; end

EnsureNode

erange

排他范围字面量

两个子节点,开始和结束节点(包括 nil 用于无头/无尾)

1…​2

RangeNode

false

假字面量

false

N/A

float

浮点字面量

一个子节点,Float 值

-123.5

FloatNode

for

for..in 循环条件

三个子节点。第一个子节点是 lvasgnmlhs 节点,包含变量;第二个子节点是表达式节点,包含要循环的数组/范围;第三个子节点是主体语句。

for a in arr do foo; end

ForNode

forward_arg

转发参数,用于 Ruby 3.0(当 emit_forward_arg 为真时)。必须位于 args 节点内部。

def whatever(foo, …​)

ArgNode

forward_args

转发参数列表,用于 Ruby 2.7(当 emit_forward_arg 为假时)。必须位于 defdefsdef_edefs_e 节点内部。

def (foo(…​)

ForwardArgsNode

forwarded_args

将参数转发到方法调用

foo(…​)

N/A

forwarded_restarg

将位置参数转发到方法调用

foo(*)

N/A

forwarded_kwrestarg

将关键字参数转发到方法调用

foo(**)

N/A

gvar

全局变量访问

一个子节点,变量名作为符号 :$foo

$foo

N/A

gvasgn

全局变量赋值

两个子节点,变量名 :$foo 和被赋值的表达式

$foo = 5

AsgnNode

hash

哈希字面量。

pair 和/或 kwsplat

{ foo: 'bar' }

HashNode

if

If、else、elif、unless 和三元条件

三个子节点。第一个子节点是表示条件的表达式节点;第二个子节点是表示真条件的表达式节点;第三个子节点是表示假条件的表达式节点。elif 将嵌套另一个 if 节点作为第三个子节点。questioncolon 位置键仅存在于三元运算符中。

if foo; bar; else; baz; end

IfNode

int

整数字面量

1,整数的值

-123

IntNode

ivar

实例变量访问

一个子节点,变量名 :@foo

@foo

N/A

ivasgn

实例变量赋值

两个子节点,变量名 :@foo 和被赋值的表达式

@foo = 5

AsgnNode

irange

包含范围字面量。

两个子节点,开始和结束节点(包括 nil 用于无头/无尾)

1..2

RangeNode

kwarg

必需关键字参数。必须位于 args 内。

一个子节点 - 一个符号,代表参数名称。

def foo(bar:)

ArgNode

kwbegin

显式 begin 块。

子节点是主体语句。

begin,end

N/A

kwnilarg

函数定义中带有 nil 的双星号,用于指定函数不接受关键字参数。必须位于 args 内。

def foo(**nil)

N/A

kwoptarg

可选关键字参数。必须位于 args 内。

两个子节点 - 一个符号,表示参数名称,以及一个表示值的表达式节点。

def foo(bar: 5)

ArgNode

kwsplat

在函数调用中使用双星号表示关键字参数(与函数定义中的用法相反)。

一个子节点,一个表达式。

foo(bar, **kwargs)

关键字参数展开节点

关键字参数剩余

在函数定义中使用双星号表示关键字参数(与函数调用中的用法相反)。必须放在 args 内部。

只有一个子节点 - 一个符号,表示参数名称(如果给出了名称)。如果没有给出名称,则没有子节点。

def foo(**kwargs)

ArgNode

局部变量

访问局部变量

只有一个子节点,即变量名称

foo

N/A

局部变量赋值

局部变量赋值

两个子节点:变量名称(符号)和表达式。

a = some_thing

AsgnNode

多重赋值

多重赋值。

第一组子节点都是 mlhs 节点,其余子节点必须是表达式节点,对应于 mlhs 节点中的值。

a, b, = [1, 2]

N/A

多重左值

多重左值。用于 masgn 和块参数解构。

子节点必须都是赋值节点。表示多重赋值的左侧(示例中的 a, b)。

a, b = 5, 6

N/A

模块

模块定义

两个子节点。第一个子节点是模块名称的 const 节点。第二个子节点是主体语句。

module Foo < Bar; end

模块节点

下一个

next 关键字

零个或一个子节点,包含一个表达式节点,用于将结果传递给下一个

next 1

N/A

空文字

N/A

第 n 个引用

正则表达式捕获组($1、$2 等)

只有一个子节点:捕获名称,例如 :$1

re = /foo(abc)/; $1

N/A

数字块

块,其中包含编号参数(_1),在块内部引用。

三个子节点。第一个子节点是 send/csend 节点,表示块的创建方式,第二个子节点是 int(数字参数的数量),第三个子节点是主体语句。

proc { _1 + _3 }

BlockNode

运算符赋值

运算符赋值 - 执行运算并赋值。

三个子节点。第一个子节点必须是赋值节点,第二个子节点是运算符(例如 :+),第三个子节点是表达式节点。

a +=

运算符赋值节点

可选参数

可选位置参数。必须放在 args 内部。

一个子节点 - 一个符号,代表参数名称。

def foo(bar=1)

ArgNode

或运算符

两个子节点都是表示操作数的表达式节点。

a 或

OrNode

or_asgn

或赋值(将接收者与参数进行或运算,并将结果赋值回接收者)。

两个子节点。第一个子节点必须是赋值节点,第二个子节点是表达式节点。

a ||=

OrAsgnNode

pair

哈希中的一个条目。

两个子节点,键节点和值节点。

1 ⇒ 2

PairNode

rational

有理数字面量

一个子节点,有理数值

2.0r

N/A

redo

Redo 命令

redo

N/A

regexp

正则表达式字面量。

子节点被分成str节点,插值由单独的表达式节点表示。最后一个子节点是regopt

/foo#{bar}56/

RegexpNode

regopt

正则表达式选项,出现在正则表达式字面量之后(例如中的“im”)。

表示选项的符号列表(例如:i:m

/foo#{bar}/im

N/A

resbody

异常救援。始终出现在rescue节点内。

三个子节点。第一个子节点是nil或表示要救援的异常的表达式节点数组。第二个子节点是nil或表示将异常保存到其中的赋值节点。最后一个子节点是主体语句。

begin; rescue Exception, A ⇒ bar; 1; end

ResbodyNode

rescue

救援语句。可以是“顶级”的,也可以嵌套在ensure块中(如果救援和确保都在块中)。

第一个节点是主体语句。最后一个子节点是“else”主体语句,或nil。其余子节点是resbody节点。

begin; rescue Exception, A ⇒ bar; 1; end

restarg

位置参数展开。必须出现在args中。

一个子节点 - 一个符号,表示参数名称(如果给出)。如果没有给出名称,则没有子节点。

def foo(*rest)

ArgNode

return

返回语句

零个或一个子节点,一个表达式节点,用于要返回的值。

return

ReturnNode

sclass

单例类声明。

两个子节点。第一个子节点是正在打开的类的表达式(例如self);第二个子节点是主体语句。

class << some_var

SelfClassNode

self

访问 self

self

N/A

send

非安全方法调用(即顶级或使用点)

第一个子节点是接收者节点(例如self),第二个子节点是方法名称(例如:foo=),其余子节点(如果有)是参数(表达式节点)。

foofoo.bar

SendNode

shadowarg

影子参数,也称为块局部变量。必须位于 args 内。

一个子节点 - 一个符号,代表参数名称。

foo { |a; b| b }

ArgNode

splat

数组或函数参数 * 运算符

一个子节点,一个表达式。

*foo

N/A

str

非插值字符串字面量。heredoc 版本的工作方式与常规版本完全不同,位置信息也完全独立。

一个子节点,即字符串内容。

"hi mom"

StrNode

super

带有参数和/或括号的超类方法调用。

子节点是表示参数的表达式节点。

super(a, b, c)

SuperNode

sym

非插值符号

一个子节点,即符号内容。

:foo

SymbolNode

true

真字面量

true

N/A

undef

方法取消定义

一个 symdsym 节点列表,表示要取消定义的方法名称。

undef :foo, :bar

N/A

until

条件先出现的负循环。

两个子节点。第一个子节点是条件的表达式节点,第二个子节点是主体语句。

until foo do bar; end

UntilNode

until_post

条件最后出现的负循环。

两个子节点。第一个子节点是条件的表达式节点,第二个子节点是主体语句。

begin; foo; end until condition

UntilNode

when

案例匹配。通常嵌套在 case 节点下。

两个子节点。第一个子节点是条件的正则表达式、表达式节点或 splat 节点。第二个子节点是结果的表达式节点或 begin 节点。

when a then

WhenNode

while

条件先出现的循环。

两个子节点。第一个子节点是条件的表达式节点,第二个子节点是主体语句。

while foo do bar; end

WhileNode

while_post

条件最后出现的循环。

两个子节点。第一个子节点是条件的表达式节点,第二个子节点是主体语句。

begin; foo; end while condition

WhileNode

xstr

执行字符串(反引号)。heredoc 版本的处理方式与常规版本完全不同。

子节点被拆分为 str 节点,插值由单独的表达式节点表示。

`date`

StrNode

yield

向块 yield。

子节点是表示参数的表达式节点。

yield(foo)

YieldNode

zsuper

没有参数或括号的超类方法调用。

super

SuperNode