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

Трейт Any и downcast

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

use std::any::Any;

#[derive(Debug)]
pub struct ThisImplementsAny;

fn take_any<T: Any>(t: &T) {}

fn main() {
    let is_an_any = ThisImplementsAny;
    take_any(&is_an_any);

    let dyn_any: &dyn Any = &is_an_any;
    dbg!(dyn_any.type_id());
    dbg!(dyn_any.is::<ThisImplementsAny>());
    let is_downcast: Option<&ThisImplementsAny> = dyn_any.downcast_ref();
    dbg!(is_downcast);
}
  • Трейт Any позволяет привести значения из dyn-значений обратно к конкретным значениям (downcast).

  • Это автотрейт: как и Send/Sync/Sized, он автоматически реализуется для любого типа, который удовлетворяет определённым критериям.

  • Критерий для Any: тип должен быть 'static, то есть не содержать внутри себя времён жизни, кроме 'static.

  • Any предоставляет два связанных поведения: downcast и проверку во время выполнения того, совпадают ли типы.

    В примере выше видно, как downcast из Any в ThisImplementsAny выполняется автоматически.

    Также видно, как Any::is используется, чтобы проверить тип значения.

  • Any не реализует рефлексию для типа; больше с Any ничего не сделать.