当您使用泛型函数或泛型类型时,编译器会 for each 不同的类型参数集生成一个单独的实例(我认为生命周期参数会被忽略,因为它们对生成的代码没有影响).这个过程叫做monomorphization.例如,Vec<i32>
和Vec<String>
是不同的类型,因此Vec<i32>::len()
和Vec<String>::len()
是不同的功能.这是必要的,因为Vec<i32>
和Vec<String>
有不同的内存布局,因此需要不同的机器代码!因此,no不存在类型擦除.
如果我们使用Any::type_id()
,如下例所示:
use std::any::Any;
fn main() {
let v1: Vec<i32> = Vec::new();
let v2: Vec<String> = Vec::new();
let a1 = &v1 as &dyn Any;
let a2 = &v2 as &dyn Any;
println!("{:?}", a1.type_id());
println!("{:?}", a2.type_id());
}
我们为Vec
的两个实例获取不同类型的ID.这支持了Vec<i32>
和Vec<String>
是不同类型的事实.
然而, rust 迹中的反射能力有限;Any
差不多是我们现在的全部了.无法获取有关运行时值类型的详细信息,例如其名称或成员.为了能够使用Any
,必须将它(使用Any::downcast_ref()
或Any::downcast_mut()
)强制转换为编译时已知的类型.