Appearance
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);
}