Rust <...>

2025-05-10

在 Rust 中,<...> 符号(称为 泛型参数列表)的用途比”仅表示结构体”更广泛。以下是完整解释:


1. 您示例中的 <OrderResponse>

serde_json::from_str::<OrderResponse>(&raw_response)
  • 作用:指定反序列化的目标类型
  • OrderResponse 确实是一个结构体(struct),但这不是 <...> 的唯一用途

2. <...> 的常见用途

场景 示例 说明
指定泛型类型 Vec<String> 表示”字符串类型的动态数组”
指定 trait 约束 fn foo<T: Display>(x: T) 要求泛型 T 必须实现 Display trait
指定生命周期 struct Foo<'a> { x: &'a i32 } 声明生命周期参数
指定常量泛型 struct Array<T, const N: usize> Rust 1.51+ 引入的常量泛型参数
指定返回类型 parse::<i32>() 明确解析的目标类型(如您的 serde_json 例子)

3. 判断 <...> 内容类型的技巧

内容形式 可能类型 示例
首字母大写的标识符 结构体/枚举/类型别名 OrderResponse, Vec<String>
小写标识符 泛型参数 T, K, V
trait 名称 trait 约束 T: Serialize + Deserialize
'a 生命周期 &'a str
数字/字符串字面量 常量泛型 [u8; 32]

4. 您的 serde_json 案例详解

// 完整函数签名(简化版)
pub fn from_str<'a, T>(s: &'a str) -> Result<T, Error>
where
    T: Deserialize<'a>;

// 使用时
let data: OrderResponse = serde_json::from_str::<OrderResponse>(json_str)?;
  • <OrderResponse> 满足了 T: Deserialize 的 trait 约束
  • 可以是结构体,也可以是枚举或基本类型(如 i32

5. 反例:不是结构体的情况

// 1. 基本类型
let num = "42".parse::<i32>()?;  // i32 是基本类型

// 2. trait 约束
fn clone_all<T: Clone>(items: &[T]) -> Vec<T> { ... }

// 3. 生命周期
struct Wrapper<'a>(&'a str);

关键结论

  • 不是所有 <...> 都表示结构体,但结构体确实常出现在其中
  • 判断依据:需要结合上下文看标识符的定义
  • 特殊记忆:当用于反序列化(如 serde_json)或解析时,<...> 内通常是目标数据结构

理解这一点后,您就能更准确地阅读 Rust 中的泛型代码了!