trait object到底是一个什么东西呢?下面先看一个例子:
use std::io::Write;
fn main() {
let mut v = vec![];
let i: Write = &mut v; //error: doesn't have a size known at compile-time
}
在上面的例子中变量v明明实现了Write trait,却没办法进行引用。编译器给出的错误提示是:变量i在编译时大小未知。如果改为let i: &dyn Write = &mut v; ,则编译正常。其中&Write就是一个trait object,它在编译期能确定大小。下面看一下它在内存中的样子:
从上面的图不难发现,trait object像是胖指针,包含对象的数据信息和行为信息。下面看一个例子:
use std::fmt::Debug;
fn show<T: Debug>(v: &T) {
println!("{:?}", v);
}
fn show_plain_type(v: &impl Debug) {
println!("{:?}", v);
}
fn new_debug() -> impl Debug {
let v = vec![1, 2];
v
}
fn main() {
let v: &dyn Debug = &new_debug();
show_plain_type(&v); // 输出:[1, 2]
show(&v); // 输出:[1, 2]
}