4.1.7 条件方法

07-条件方法 — Comprehensive Rust

译文 · 基于 Comprehensive Rust

原文链接: https://google.github.io/comprehensive-rust/idiomatic/polymorphism/refresher/conditional-methods.html

4.1.7 条件方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0
// 类型定义上不加 trait 约束。
pub struct Value<T>(T);

// 约束放在该类型的实现上。
impl<T: std::fmt::Display> Value<T> {
    fn log(&self) {
        println!("{}", self.0);
    }
}

// 另一种写法
impl<T> Value<T> {
    // 在 where 表达式中指定 trait 约束
    fn log_error(&self)
    where
        T: std::error::Error,
    {
        eprintln!("{}", self.0);
    }
}
  • 编写带泛型参数的类型时,可以为该类型写出依赖参数本身或其实现哪些 trait 的实现。

  • 只有当类型满足这些条件时,这些方法才可用。

  • 对于有序集合这类希望内部类型始终为 Ord 的场景,在类型参数上用这种方式加 trait 约束是首选做法。

    我们不把约束写在类型定义本身上,否则凡是带着泛型参数提到该类型的地方都会引发下游问题。

    用条件方法实现,同样可以很好地维护不变量。

最后修改 August 11, 2026: 更新 (70a5af133)