Rust 1.7.0 语法基础 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(){
       ...
    }
时间: 2024-08-05 23:20:23

Rust 1.7.0 语法基础 attribute的相关文章

Rust 1.7.0 语法基础 标识符(ident)和分隔符的约束

一.标识符 identifier 是标识符,在Rust语法中简写为 ident . ident 是由任意个非空的unicode字符组成. 举例: 在 attribute 语法中,有 meta_item : ident [ '=' literal | '(' meta_seq ')' ] ? ; 实际使用如下: #![crate_type = "lib"] #![allow(dead_code)] #![feature(intrinsics, lang_items)] #[test] 上

Rust 1.7.0 语法基础 sep_token 和 non_special_token

一.分隔符 sep_token 指的是分隔符, 是除了 * 和 + 之外的不论什么符号,通常情况下是使用 , 逗号. 比如: 宏的多个參数分隔,以下代码中的逗号就是 sep_token (target: $target:expr, $lvl:expr, $($arg:tt)+) => ({ ... }; 二.非指定符号 non_special_token 是除了分界符之外的不论什么符号,分界符包含$ 和 ;

C# 6.0语法新特性体验(二)

之前我在文章通过Roslyn体验C# 6.0的新语法中介绍了一些C# 6.0的语法特性,现在随着Visual Studio 14 CTP3的发布,又陆续可以体验一些新的特性了,这里简单的介绍一下之前没有介绍的新语法. 属性表达式(Property Expressions) 我们常常会在类中写一些通过函数生成的只读属性: ????class Point????{????????public int X { get; set; }????????public int Y { get; set; }

Swift语法基础入门三(函数, 闭包)

Swift语法基础入门三(函数, 闭包) 函数: 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被用于“调用”函数 格式: func 函数名称(参数名:参数类型, 参数名:参数类型...) -> 函数返回值 { 函数实现部分 } 没有参数没有返回值 可以写为 ->Void 可以写为 ->() 可以省略 Void.它其实是一个空的元组(tuple),没有任何元素,可以写成() func say() -> V

php语法基础

php变量 php变量用于存储字符,数字,数组甚至对象资源等,以便在我们需要的地方使用. $变量名=值; 变量名以字母(a-z,A-Z)或者下划线_开始,后面可以跟 任意字母或数字以及下划线,但不能是空格. 例子: <?php $var_char="你好"; echo $var_char; ?> 结果为:你好! 延伸:与c语言等强类型的编程语言不通,php 是一门松散类型的语言,即不需要在设置变量之前 声明该变量.根据变量被设置的方式,php会自动 地将变量转换成正确的数据

iOS复习笔记2:Objective-C语法基础

一 语法基础 1 关键字 关键字基本上都是以@开头,常见关键字如下: @interface,@implement,@end,@public,@private,@selector,@required,@encode等 其他id,self,super等 2 字符串以@开头 @"Hello world!" 3 布尔类型Yes/No 4 空类型nil(值为0) 5 其他C语言语法 二 OC的HelloWorld程序 // helloworld.m #import <Foundation/

java基础知识(2)---语法基础

二:java语法基础: 1,关键字:其实就是某种语言赋予了特殊含义的单词. 保留字:其实就是还没有赋予特殊含义,但是准备日后要使用过的单词. 2,标示符:其实就是在程序中自定义的名词.比如类名,变量名,函数名.包含 0-9.a-z.$._ : 注意: 1),数字不可以开头. 2),不可以使用关键字. 3,常量:是在程序中的不会变化的数据. 4,变量:其实就是内存中的一个存储空间,用于存储常量数据. 作用:方便于运算.因为有些数据不确定.所以确定该数据的名词和存储空间. 特点:变量空间可以重复使用

c++笔记——语法基础1

c++笔记将记载一个温习路径,也算一个快速学习的参考吧!(不一定全面,想到什么就写什么.要学习的同志最好是有权威的书坐镇) 笔记大概会有如下有几个部分:语法基础,使用拓展库,实用工程,补充说明 数据类型: 简单类型:(byte = 8 bit,以下所示为32bit系统,bit不同稍有区别:除ab都可以在类型标识unsigned,表示无符号,一般最高位0表示正,1表示﹣,那么其取值范围也可以类推) a) void: 0byte 无值域 void b) bool: 1byte true/false

Javascript语法基础

Javascript语法基础   一.基本数据类型   JavaScript中支持数字.字符串和布尔值三种基本数据类型: 1.数字 数字型是JavaScript中的基本数据类型.在JavaScript中的数字不区分整型和浮点型,所有的数字都是以浮点型来表示的. 2.字符串 字符串型是JavaScript中用来表示文本的数据类型,是由Unicode字符.数字和标点符号组成的一个字符串序列.字符串通常都是用单引号或双引号括起来的.如果在字符串中包括着特殊字符,可以使用转义字符来代替.例如: “”