Rust 属性语法

文章目录

1.简介

Rust 中的属性(Attribute)是一种元数据注解,用于向编译器或工具传递额外信息

它们以 #[]#![] 开头,可以附加在 crate、模块、函数、结构体、枚举等代码元素上。它们不会影响代码的业务逻辑,而是指导编译器如何编译、进行何种检查,或为代码生成特定的实现。

2.属性语法要点

语法形式 示例 含义
#[attribute] #[derive(Debug)] 属性应用于它下面紧邻的元素(函数、结构体等)。
#![attribute] #![deny(warnings)] 属性应用于包含它的整个容器(如整个 crate 或模块)。

区分技巧 :有感叹号 ! 的是内部属性 ,作用于整个容器;没有 ! 的是外部属性,作用于紧邻的代码元素。

3.常见属性类型

属性类型 作用 使用场景
派生属性 #[derive(...)] 为结构体或枚举自动生成常用 trait 的实现(如 DebugCloneCopy 等)。 节省大量样板代码,快速获得调试、克隆等功能。
条件编译属性 #[cfg(...)] 根据特定条件(如操作系统、架构)决定是否包含某段代码。 编写跨平台代码时,为不同系统提供特定实现。
Crate 级属性 #![] 应用于整个 crate(通常放在 lib.rsmain.rs 的顶部)。 设置 crate 类型、禁止警告、开启全局 #![deny(warnings)] 等。
测试属性 #[test] 将函数标记为单元测试。 编写测试用例,执行 cargo test 时会自动运行。
特性标记 #[must_use] 当返回值未被使用时触发编译警告。 强调函数返回的结果不应被忽略(如 Result 类型)。
工具属性 #[allow(...)] / #[deny(...)] 调整 lint 警告级别,忽略或强制通过某些代码检查。 控制编译器警告,保持代码质量。
外部函数接口 #[repr(C)] 强制 Rust 类型的内存布局与 C 语言兼容。 与 C 语言交互、操作系统编程或嵌入式开发时。

4.使用示例

下面通过几个典型的示例帮助你快速理解:

rust 复制代码
// 1. 派生属性:自动实现 Debug trait,让结构体可以方便打印
#[derive(Debug)]
struct User {
    name: String,
    age: u8,
}

// 2. 条件编译属性:只在 Linux 系统上包含这段代码
#[cfg(target_os = "linux")]
fn get_os_name() -> &'static str {
    "Linux"
}

// 3. Crate 级属性:禁止所有警告(通常放在文件最顶部)
#![deny(warnings)]

// 4. 测试属性:单元测试
#[test]
fn test_addition() {
    assert_eq!(2 + 2, 4);
}

// 5. 特性标记:提醒调用者必须处理 Result
#[must_use = "这个函数返回一个必须处理的 Result"]
fn dangerous_operation() -> Result<(), &'static str> {
    Err("出错了!")
}

// 6. 工具属性:忽略"未使用变量"警告
#[allow(unused_variables)]
fn ignore_me(x: i32) {
    // 没有使用参数 x,但编译器不会报警
}

5.总结

Rust 属性 #[] 是给编译器和工具的"指令",用于自动生成代码、控制编译条件、管理警告等。

有外属性 #[](作用于下方元素)和内属性 #![](作用于整个容器)两种形式。


参考文献

Rust 程序设计语言中文版

相关推荐
TDengine (老段)17 分钟前
TDengine Go 与 Rust 连接器 — 高性能异步访问
大数据·数据库·物联网·golang·rust·时序数据库·tdengine
魔力女仆3 小时前
【RUST AI】把 TTS 搬进浏览器:kokoroi-rs 的 WASM 实践
人工智能·rust·wasm
米尔的可达鸭5 小时前
UDP 通信深度实验:从 Windows FastPath 到 ICMP 端口不可达的完整排查
windows·websocket·网络协议·rust·udp·wireshark·tcpdump
jinshw6 小时前
自己实现GIS配图软件(二)
前端·后端·rust
行走的陀螺仪7 小时前
从 nvm 到 fnm:更快、更省心的 Node.js 版本管理器迁移指南
rust·node.js·nvm·fnm
逻极20 小时前
Rust 从入门到精通:内存安全与高性能系统编程实战
rust·系统编程·性能·内存安全
Yeauty1 天前
渲染成图再 CLI 拼接,还是进程内直推?Rust 帧到视频的两条路
开发语言·rust·音视频
向夏威夷 梦断明暄1 天前
从 Bun 的 Rust 重写,看 C# 如何重建 AI 基础设施层
人工智能·rust·c#
Ivanqhz1 天前
Rust collect() 浅析
开发语言·后端·rust
Ivanqhz2 天前
Rust &‘static str浅析
java·前端·javascript·rust