标签:
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(){
...
}
标签:
原文地址:http://blog.csdn.net/teamlet/article/details/51177402