Трейты, совместимые с dyn
// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0
pub trait Trait {
// совместим с dyn
fn takes_self(&self);
// совместим с dyn, но этот метод нельзя использовать через dyn
fn takes_self_and_param<T>(&self, input: &T);
// больше не совместим с dyn
const ASSOC_CONST: i32;
// больше не совместим с dyn
fn clone(&self) -> Self;
}
-
Не все трейты можно вызывать как объекты трейтов. Трейт, который можно так вызывать, называется совместимым с dyn.
-
Раньше это называлось object safe traits или object safety.
-
Динамическая диспетчеризация переносит большой объём информации о типах, известной на этапе компиляции, в информацию vtable, которая существует во время выполнения.
Если концепция несовместима с тем, что осмысленно хранить в vtable, то либо трейт перестаёт быть совместимым с dyn, либо эти методы исключаются из возможных вызовов в контексте dyn.
-
Трейт совместим с dyn, если все его супертрейты совместимы с dyn, у него нет ассоциированных констант и типов и нет методов, зависящих от обобщений.
-
Чаще всего вы столкнётесь с трейтами, несовместимыми с dyn, когда у них есть ассоциированные типы или константы либо когда они возвращают
Self(например, трейт Clone несовместим с dyn).Это потому, что ассоциированные данные пришлось бы хранить в vtable, занимая дополнительную память.
Для таких методов, как
clone, это исключает совместимость с dyn, потому что тип результата зависит от конкретного типаself.
Справка:
- https://doc.rust-lang.org/1.91.1/reference/items/traits.html#r-items.traits.dyn-compatible