Rust 属性语法
文章目录
- 1.简介
- 2.属性语法要点
- 3.常见属性类型
- 4.使用示例
- 5.总结
- 参考文献
1.简介
Rust 中的属性(Attribute)是一种元数据注解,用于向编译器或工具传递额外信息。
它们以#[]或#![]开头,可以附加在 crate、模块、函数、结构体、枚举等代码元素上。它们不会影响代码的业务逻辑,而是指导编译器如何编译、进行何种检查,或为代码生成特定的实现。
2.属性语法要点
| 语法形式 | 示例 | 含义 |
|---|---|---|
#[attribute] | #[derive(Debug)] | 属性应用于它下面紧邻的元素(函数、结构体等)。 |
#![attribute] | #![deny(warnings)] | 属性应用于包含它的整个容器(如整个 crate 或模块)。 |
区分技巧:有感叹号
!的是内部属性,作用于整个容器;没有!的是外部属性,作用于紧邻的代码元素。
3.常见属性类型
| 属性类型 | 作用 | 使用场景 |
|---|---|---|
派生属性#[derive(...)] | 为结构体或枚举自动生成常用 trait 的实现(如Debug、Clone、Copy等)。 | 节省大量样板代码,快速获得调试、克隆等功能。 |
条件编译属性#[cfg(...)] | 根据特定条件(如操作系统、架构)决定是否包含某段代码。 | 编写跨平台代码时,为不同系统提供特定实现。 |
Crate 级属性#![] | 应用于整个 crate(通常放在lib.rs或main.rs的顶部)。 | 设置 crate 类型、禁止警告、开启全局#![deny(warnings)]等。 |
测试属性#[test] | 将函数标记为单元测试。 | 编写测试用例,执行cargo test时会自动运行。 |
特性标记#[must_use] | 当返回值未被使用时触发编译警告。 | 强调函数返回的结果不应被忽略(如Result类型)。 |
工具属性#[allow(...)]/#[deny(...)] | 调整 lint 警告级别,忽略或强制通过某些代码检查。 | 控制编译器警告,保持代码质量。 |
外部函数接口#[repr(C)] | 强制 Rust 类型的内存布局与 C 语言兼容。 | 与 C 语言交互、操作系统编程或嵌入式开发时。 |
4.使用示例
下面通过几个典型的示例帮助你快速理解:
// 1. 派生属性:自动实现 Debug trait,让结构体可以方便打印#[derive(Debug)]structUser{name:String,age:u8,}// 2. 条件编译属性:只在 Linux 系统上包含这段代码#[cfg(target_os ="linux")]fnget_os_name()->&'staticstr{"Linux"}// 3. Crate 级属性:禁止所有警告(通常放在文件最顶部)#![deny(warnings)]// 4. 测试属性:单元测试#[test]fntest_addition(){assert_eq!(2+2,4);}// 5. 特性标记:提醒调用者必须处理 Result#[must_use ="这个函数返回一个必须处理的 Result"]fndangerous_operation()->Result<(),&'staticstr>{Err("出错了!")}// 6. 工具属性:忽略“未使用变量”警告#[allow(unused_variables)]fnignore_me(x:i32){// 没有使用参数 x,但编译器不会报警}5.总结
Rust 属性#[]是给编译器和工具的“指令”,用于自动生成代码、控制编译条件、管理警告等。
有外属性#[](作用于下方元素)和内属性#两种形式。
参考文献
Rust 程序设计语言中文版
