Rust attribute

 

一、语法

attribute : '#' '!' ? '[' meta_item ']' ;
meta_item : ident [ '=' literal  | '(' meta_seq ')' ] ? ;
meta_seq : meta_item [ ',' meta_seq ] ? ;

 

二、说明

使用Java的人都知道,Java有个 annotation 注解。
Rust 也有注释,名称和C#的注释一样,叫做 attribute。

Rust attribute 用于在源代码中标识编译过程中的判断条件和上下文环境。

语法中单引号扩起来的内容表示字符原来的含义;
字符后面的?表示通配符,用来表示前面字符的数量;
[] 方括号表示扩起来的内容是可选项,注意这里的[]方括号没有被单引号扩起来;
; 每行最后以分号表示这一行定义的结束;
| 表示前后内容可以任意选择其一;

1、第一行语法解释

attribute : '#' '!' ? '[' meta_item ']' ;

attribute :表示冒号后面是 attribute 的定义;
# 所有的 attribute 以#开始;
!? 问号❓是一个通配符,表示前面的字符!只能有 0 个或者 1个;

#!的形式,表示这个属性应用在当前的crate。
# 的形式,表示这个属性应用在跟随在 attribute 下面的代码。

#![meta_item]
#[meta_item]

meta_item 解释如下。

2、第二行语法解释

在第一行语法中包含的 meta_item 的定义展开

meta_item : ident [ '=' literal  | '(' meta_seq ')' ] ? ;

ident 是一组 Rust 定义好的 key,用以标识attribute的作用。key值参见 Rust Attribute的十三个分类包含的注释

meta_item 以一个 ident 开始,表明这个 attribute 的目标;
ident后面可以用 =等号赋值,形成 key = value 的形式,或者
ident后面可以跟一个小括号 (),括号内是 meta_seq
[] 表示 ident= literal 或者 ident ( ) 可以任选其一
? 表示前面[]中的任选其一的内容可以并尽有 0 个 或者 1个。

3、第三行语法解释

上面的语法中,meta_seq 是包含在后一种选择情况的括号里,
因此,这里的 meta_item 等同于 ident(meta_seq)

meta_seq : meta_item [ ',' meta_seq ] ? ;

[]表示扩起来的内容可选
? 表示可以有 0 个或者 1个
如果有,形式是

ident ( meta_seq , meta_seq )

因为 meta_seq 又指向自身,故有

ident ( meta_seq [, meta_seq]*)

`* `也是通配符,表示可以有 0 到任意多个

 

三、举例

    
//下面的 attribute 用于 crate
#![crate_type = "lib"]
#![allow(dead_code)]
#![feature(intrinsics, lang_items)]
    
//下面的 attribute 用于测试运行代码后面
#[test]
fn test_function(){
    ...
}

宏(macro) 是 Rust 中的一种高级特性,Rust 中的宏分为两种: 声明性宏(declarative macros)程序宏(procedural macros) Custom #[derive] ma ...