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

// 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