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 ...