Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Обобщённые параметры функций и dyn Trait

Есть два способа писать полиморфные функции. Чем они отличаются?

// 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);
}
  • Полиморфные функции можно писать над обобщениями или над объектами трейтов.

  • При написании функций с обобщёнными параметрами для каждого уникального типа, который подставляется вместо параметра, генерируется новая версия функции.

    Мы уже разбирали это в разделе о мономорфизации: в обмен на размер бинарного файла мы получаем больше возможностей для оптимизации.

  • При написании функций, принимающих объект трейта, в итоговом бинарном файле будет существовать только одна версия такой функции (не считая инлайнинга).

  • Обобщённые параметры не имеют стоимости, кроме размера бинарного файла. Типы должны быть однородными: все экземпляры T могут быть только одного типа.