Обобщённые параметры функций и 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могут быть только одного типа.