0

我试图了解特征对象是如何在 Rust 中实现的。请让我知道以下理解是否正确。

我有一个函数可以采用任何实现Write特征的类型:

fn some_func(write_to: &mut Write) {}

在我们有实现此特征并调用上述函数的类型的任何地方,编译器都会生成一个“特征对象”,可能是通过添加对TraitObject::new(data, vtable).

如果我们有类似的东西:

let input = get_user_input(); // say we are expecting the input to be 1 or 2
let mut file = File::new("blah.txt").unwrap();
let mut vec: Vec<u8> = vec![1, 2, 3];

match input {
    1 => some_func(&mut file),
    2 => some_func(&mut vec),
}

可能会变成:

match input {
    1 => {
        let file_write_trait_object: &mut Write =
            TraitObject::new(&file, &vtable_for_file_write_trait);
        some_func(file_write_trait_object);
    }
    2 => {
        let vec_write_trait_object: &mut Write =
            TraitObject::new(&vec, &vtable_for_vec_write_trait);
        some_func(vec_write_trait_object);
    }
}

编译器内部some_func将仅访问基于TraitObject传递的 vtable 使用的方法。

4

1 回答 1

0

特征对象是胖指针,因此fn some_func(write_to: &mut Write)编译为类似fn some_func(_: *mut OpaqueStruct, _: *const WriteVtable).

于 2017-12-22T02:20:16.623 回答