Rust笔记 - trait object

353 阅读1分钟

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]
}