• 获取类型名称。
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,都可以通过此函数进行打印。