【问题标题】:How are trait objects implemented in Rust?Rust 中的 trait 对象是如何实现的?
【发布时间】:2019-10-17 20:50:52
【问题描述】:

我试图了解 trait 对象是如何在 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 使用的方法。

【问题讨论】:

  • 您是否阅读过documentation for TraitObject,其中指出:TraitObject 保证匹配布局,但它不是特征对象的类型[...],也不能控制它布局 [...]。它仅设计用于需要操作低级细节的不安全代码。
  • @Shepmaster:我想了解上面是否捕获了编译器如何构造特征对象并传递给被调用函数的“想法”。

标签: rust traits trait-objects


【解决方案1】:

特征对象是胖指针,所以fn some_func(write_to: &amp;mut Write) 编译成类似fn some_func(_: *mut OpaqueStruct, _: *const WriteVtable) 的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多