属性
属性是应用于某些模块、crate 或项目的元数据。此元数据可用于:
- 代码的条件编译
- 设置 crate 名称、版本和类型(二进制文件或库)
- 禁用 lints(警告)
- 启用编译器功能(宏、全局导入等)
- 链接到外部库
- 将函数标记为单元测试
- 标记将成为基准测试一部分的函数
- 类似于宏的属性
属性看起来像 #[outer_attribute]
或 #![inner_attribute]
,它们之间的区别在于应用位置。
-
#[outer_attribute]
应用于紧随其后的项。项的一些示例是:函数、模块声明、常量、结构体、枚举。以下示例展示了属性#[derive(Debug)]
如何应用于结构体Rectangle
#![allow(unused)] fn main() { #[derive(Debug)] struct Rectangle { width: u32, height: u32, } }
-
#![inner_attribute]
应用于封闭的项(通常是模块或 crate)。换句话说,此属性被解释为应用于它所在位置的整个作用域。以下示例展示了#![allow(unused_variables)]
如何应用于整个 crate(如果放置在main.rs
中)#![allow(unused_variables)] fn main() { let x = 3; // This would normally warn about an unused variable. }
属性可以使用不同的语法接受参数
#[attribute = "value"]
#[attribute(key = "value")]
#[attribute(value)]
属性可以有多个值,并且也可以分布在多行中
#[attribute(value, value2)]
#[attribute(value, value2, value3,
value4, value5)]