闽公网安备 35020302035485号
• 获取类型名称。
pub trait Any: 'static {
fn type_id(&self) -> TypeId;
}
impl<T: 'static + ?Sized> Any for T {
fn type_id(&self) -> TypeId {
TypeId::of::<T>()
}
}
通过type_id方法可以唯一标识类型,而is和downcast_ref方法提供了类型检查和类型转换的能力。use std::any::{Any, TypeId};
fncheck_string(s: &dyn Any) {
if s.is::<String>() {
println!("这是一个字符串!");
} else {
println!("不是字符串...");
}
}
fnprint_if_string(s: &dyn Any) {
ifletSome(ss) = s.downcast_ref::<String>() {
// 堆代码 duidaima.com
println!("字符串内容(长度{}): '{}'", ss.len(), ss);
} else {
println!("不是字符串...");
}
}
fnmain() {
letname = String::from("Rust");
check_string(&name);
print_if_string(&name);
}
上述代码中,is用于判断变量类型,而downcast_ref则提供了将变量转换为指定类型的能力。use std::any::Any;
use std::fmt::Debug;
#[derive(Debug)]
structMyType {
name: String,
age: u32,
}
fnprint_any<T: Any + Debug>(value: &T) {
letvalue_any = value as &dyn Any;
ifletSome(string) = value_any.downcast_ref::<String>() {
println!("字符串内容:{}", string);
} elseifletSome(MyType { name, age }) = value_any.downcast_ref::<MyType>() {
println!("MyType ({}, {})", name, age)
} else {
println!("{:?}", value);
}
}
无论是内置类型还是自定义类型,只要实现了Debug trait,都可以通过此函数进行打印。