4.2.8 泛型 vs Trait 对象

08-泛型 vs Trait 对象 — Comprehensive Rust

译文 · 基于 Comprehensive Rust

原文链接: https://google.github.io/comprehensive-rust/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-vs-generics.html

4.2.8 泛型 vs Trait 对象

我们有两种编写多态函数的方式,它们如何比较?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0
fn print_display<T: std::fmt::Display>(t: &T) {
    println!("{}", t);
}

fn print_display_dyn(t: &dyn std::fmt::Display) {
    println!("{}", t);
}

fn main() {
    let int = 42i32;
    // 单态化为针对 i32 输入的唯一函数。
    print_display(&int);
    // 每种
    print_display_dyn(&int);
}
  • 我们可以用泛型或 trait 对象编写多态函数。

  • 编写带泛型参数的函数时,每个替换参数的唯一类型都会生成该函数的一个新版本。

    我们在单态化中讲过:以二进制体积换取更大的优化空间。

  • 编写接受 trait 对象的函数时,最终二进制中只会存在该函数的一个版本(不计内联)。

  • 泛型参数除二进制体积外是零成本的。类型必须同构(T 的所有实例只能是同一类型)。

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