Skip to content

26.4 Any

Rust 标准库中提供了一个乞丐版的“反射”功能,那就是std::any模块。这个模块内,有个 trait 名字叫作 Any。所有的类型都自动实现了 Any 这个 trait,因此我们可以把任何一个对象的引用转为&Any这个 trait object,然后调用它的方法。

它可以判断这个对象是什么类型,以及强制转换&Any为某个具体类型。另外,成员函数type_id()暂时要求'static约束,这个限制条件以后会放宽。

基本用法示例如下:


rust
#![feature(type_id)]

use std::fmt::Display;
use std::any::Any;

fn log<T: Any + Display>(value: &T) {
    let value_any = value as &Any;

    if let Some(s) = value_any.downcast_ref::<String>() {
        println!("String: {}", s);
    }
    else if let Some(i) = value_any.downcast_ref::<i32>() {
        println!("i32: {}", i);
    } else {
        let type_id = value_any.type_id();
        println!("unknown type {:?}: {}", type_id, value);
    }
}

fn do_work<T: Any + Display>(value: &T) {
    log(value);
}

fn main() {
    let my_string = "Hello World".to_string();
    do_work(&my_string);

    let my_i32: i32 = 100;
    do_work(&my_i32);

    let my_char: char = '❤';
    do_work(&my_char);
}

Released under the MIT License