Трейт 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ничего не сделать.