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 для динамической диспетчеризации в Rust

// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0

pub trait Trait {}

impl Trait for i32 {}
impl Trait for String {}

fn main() {
    let int: &dyn Trait = &42i32;
    let string: &dyn Trait = &String::from("Hello dyn!");;
}
  • Динамическая диспетчеризация — инструмент объектно-ориентированного программирования, который часто используют там, где важнее поведение типа, а не то, чем тип является.

    В ООП-языках динамическая диспетчеризация часто происходит неявно, и от неё нельзя отказаться.

    В Rust используется dyn Trait: динамическая диспетчеризация, которую нужно включить явно.

  • Для любого трейта, который совместим с dyn, можно привести ссылку на значение этого трейта к значению dyn Trait.

  • Их называют объектами трейтов. Их тип неизвестен на этапе компиляции, но поведение известно: оно задаётся самим трейтом.

  • Когда вам действительно нужны разнородные структуры данных в стиле ООП, можно использовать Box<dyn Trait>, но сначала постарайтесь сохранить однородность и опираться на обобщения!