Rust #[] 语法

在 Rust 中,#[] 语法用于 属性(Attributes),这是一种特殊的元数据注解,用于向编译器提供额外信息或修改代码的行为。它们类似于其他语言中的注解(如 Java)或装饰器(如 Python)。

核心概念

  1. 基本形式

    • 外部属性#[attr](应用于后面的代码项)

    • 内部属性#![attr](应用于整个作用域,如模块或 crate)

  2. 常见用途

    • 条件编译(#[cfg]

    • 禁用编译器警告(#[allow]

    • 实现 trait(#[derive]

    • 标记测试函数(#[test]

    • 配置优化(#[inline]

    • 链接外部库(#[link]


深入示例解析

1. 条件编译 #[cfg]
#[cfg(target_os = "linux")]
fn linux_only() {
    println!("Running on Linux!");
}

#[cfg(not(target_os = "linux"))]
fn not_linux() {
    println!("Not on Linux!");
}
  • 作用:只在特定平台/条件下编译代码

  • 等价命令rustc --cfg 'target_os="linux"'


2. 派生 Trait #[derive]
#[derive(Debug, Clone, PartialEq)]
struct Point {
    x: i32,
    y: i32,
}
  • 效果:自动实现 Debug(打印)、Clone(克隆)、PartialEq(比较)等 trait

  • 原理:编译器生成默认实现代码


3. 禁用警告 #[allow]
#[allow(dead_code)] // 忽略"未使用代码"警告
fn unused_function() {}

4. 测试函数 #[test]

#[test]
fn test_addition() {
    assert_eq!(2 + 2, 4);
}
  • 运行测试:cargo test

  • 标记为测试的函数会被编译进单独的可执行文件


5. 内联优化 #[inline]
#[inline(always)] // 强制内联展开
fn add(a: i32, b: i32) -> i32 {
    a + b
}

特殊属性

属性作用示例
#[no_mangle]禁用名称修饰(用于 FFI)#[no_mangle] pub extern fn
#[repr(C)]指定 C 兼容内存布局#[repr(C)] struct Data
#![feature]启用实验性功能(仅 nightly)#![feature(specialization)]
#![crate_type]指定 crate 类型(lib/bin)#![crate_type = "lib"]

自定义属性(高级)

通过过程宏可创建自定义属性:

// 自定义属性宏(需在单独 crate 中定义)
#[proc_macro_attribute]
pub fn log_call(_attr: TokenStream, item: TokenStream) -> TokenStream {
    // 自动插入日志代码
    let input = parse_macro_input!(item as ItemFn);
    /* ...生成新代码... */
}

使用示例:

#[log_call]
fn expensive_calculation() { ... }
// 编译时会自动插入日志代码

最佳实践

  1. 优先使用标准属性(如 derivecfg

  2. 谨慎使用 unsafe 相关属性(如 repr

  3. 避免过度使用 inline(编译器通常能更好决策)

  4. 条件编译时提供兜底实现 提升可移植性

        属性是 Rust 元编程的核心工具之一,合理使用可以极大提升代码的表达力和灵活性,同时保持安全性。

### Rust 编程语言基本语法规则 #### 变量声明 在 Rust 中,变量默认是不可变的。如果希望创建可变变量,则需要使用 `mut` 关键字。以下是定义变量的方式: ```rust let x = 5; // 不可变变量 let mut y = 10; // 可变变量 y = 15; ``` 上述代码展示了如何通过 `let` 绑定一个值到名称上,并且可以通过指定 `mut` 来允许后续修改该绑定的值[^1]。 #### 数据类型 Rust 提供了多种内置数据类型,其中包括整数、浮点数、布尔值以及字符等基础类型。对于字符处理,Rust 使用 Unicode 的 UTF-8 编码标准来支持多语言文字表示[^4]。 ```rust fn main() { let a: i32 = 100; // 显式类型的整数 let b = true; // 布尔值 let c: f64 = 3.14; // 浮点数,默认f64 let d: char = &#39;α&#39;; // 单个Unicode字符 } ``` #### 控制结构 Rust 支持常见的条件判断和循环控制结构,如 `if` 表达式、`loop`、`while` 和 `for` 循环。值得注意的是,`if` 在 Rust 中是一个表达式而非语句,这意味着它可以被用来作为赋值的一部分[^2]。 ```rust // If 表达式的例子 let number = if condition { 5 } else { 6 }; // For 循环遍历集合 let array = [1, 2, 3]; for element in &array { println!("{}", element); } ``` #### 函数定义 函数可以接受参数并可能返回某种结果。当函数不显式包含 `return` 时,最后一个表达式的值会被自动视为返回值。 ```rust fn add(x: i32, y: i32) -> i32 { x + y // 返回计算的结果 } fn greet(name: &str) { println!("Hello, {}!", name); } ``` #### 所有权机制 为了实现内存安全性而不依赖垃圾回收器,Rust 引入了一个独特的概念——所有权(Ownership)。每一个值都有唯一的一个所有者,当这个所有者超出作用域时,它所拥有的资源就会被释放掉[^3]。 ```rust fn take_ownership(some_string: String) { println!("{}", some_string); // 使用some_string... } // ...之后离开scope,some_string被drop ``` #### 生命周期标注 生命周期是用来确保借用不会超过其所借对象的生命期的一种方法。这有助于防止悬垂指针等问题的发生。 ```rust struct ImportantExcerpt<&#39;a> { part: &&#39;a str, } impl<&#39;a> ImportantExcerpt<&#39;a> { fn level(&self) -> i32 { 3 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值