Rust 中的属性

本文详细介绍了Rust编程语言中的属性(Attributes),包括它们的用途、语法、分类以及常用属性如`test`和`derive`。属性在Rust中用于条件编译、控制编译器行为、生成代码等,例如`#[test]`用于标记测试函数,`#[derive(PartialEq, Clone)]`用于自动生成数据类型的比较和克隆实现。同时,文章还提到了属性的内外部区别以及如何链接外部库。
摘要由CSDN通过智能技术生成

属性是什么

属性(Attribute)是一种通用的自由格式的元数据,Rust 中的属性以ECMA-335中的为模型,其语法则来自ECMA-334(C#)。

属性的用途

属性只能应用于 Rust 中的项(Item),属性的主要用途如下:

  • 条件编译
  • 设置 Crate 名称,版本和类型(binary 或 library)
  • 自动生成代码
  • 控制 Linter 的行为
  • 启用编译器的一些特性
  • 链接外部的 library
  • 标记单元测试函数

属性的语法

属性的语法借鉴了 C#,内部属性(Inner attributes)以 #! 开头,外部属性(Outer attributes)则以 # 开头。内部属性应用于它所在的项(Item),外部属性应用于紧跟在它之后的项(Item)。

属性中的参数支持不同的语法形式,比如:

#[no_std]
#[doc = "example"]
#[allow(unused, clippy::inline_always)]
#[macro_use(foo, bar)]
#[link(name = "CoreFoundation", kind = "framework")]

属性的分类

属性可以被分为以下四类:

常用的属性

Test

test 属性用来把一个函数标记为单元测试函数,这些函数只有在测试模式下(cargo testrustc --test)才会被编译。测试函数没有参数,并且返回值类型必须是以下两种:

  • ()
  • Result<(), E> where E: Error

示例

#[test]
fn test_the_thing() -> io::Result<()> {
    let state = setup_the_thing()?;
    do_the_thing(&state)?;
    Ok(())
}

Derive

derive 属性一般用来为数据类型生成 Trait 实现。

示例

#[derive(PartialEq, Clone)]
struct Foo<T> {
    a: i32,
    b: T,
}

编译器会自动为 Foo 生成 PartialEq 的实现:

impl<T: PartialEq> PartialEq for Foo<T> {
    fn eq(&self, other: &Foo<T>) -> bool {
        self.a == other.a && self.b == other.b
    }

    fn ne(&self, other: &Foo<T>) -> bool {
        self.a != other.a || self.b != other.b
    }
}

目前 derive 仅支持标准库中部分的 Trait,我们也可以通过 procedural macros 来为自己的 Trait 实现 derive。其实,标准库里也是通过这种方式实现的,比如:Debug

相关资料

Attributes - The Rust Reference

Attributes - Rust By Example

属性 · RustPrimer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值