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 でできるのはこれだけです。