Any トレイトとダウンキャスト
// 著作権 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 値から具象値へダウンキャストし直すことができます。 -
これは auto trait です。Send/Sync/Sized と同様に、特定の条件を満たすすべての型に対して自動的に実装されます。
-
Anyの条件は、型が'staticであることです。つまり、その型の内部に非'staticなライフタイムを一切含まないということです。 -
Anyは、関連する 2 つの振る舞いを提供します。ダウンキャストと、型が同一であるかどうかの実行時チェックです。上の例では、
AnyからThisImplementsAnyへ自動的にダウンキャストできることがわかります。また、値がどの型であるかを確認するために
Any::isが使われていることもわかります。 -
Anyは型に対するリフレクションを実装するものではなく、Anyでできるのはこれだけです。