> 到盒子>?,rust"/>

首页 > 解决方案 > 有什么办法可以转换Box> 到盒子>?

问题描述

考虑这样的代码:

trait Foo {
    fn foo(&self);
}

fn consume_func(b: Box<Box<Foo>>) {
    unimplemented!();
}

fn produce_func() -> Box<Box<Foo + Send>> {
    unimplemented!();
}

fn main() {
    let b = produce_func();
    consume_func(b);
}

它不编译:

error[E0308]: mismatched types
  --> src/main.rs:24:18
   |
24 |     consume_func(b);
   |                  ^ expected trait `Foo`, found trait `Foo + std::marker::Send`
   |
   = note: expected type `std::boxed::Box<std::boxed::Box<Foo + 'static>>`
              found type `std::boxed::Box<std::boxed::Box<Foo + std::marker::Send>>`

doubleBox一种为 C 库提供void *来自Box<Trait>. 由于胖指针,我无法转换Box<Foo>void *.

我不能改变consume_func,我宁愿不使用unsafe或额外分配。

标签: rust

解决方案


这是一种方法:取消引用b(将其“拆箱”为 a Box<Foo + Send>),然后立即将其包装在 another 中Box<T>,从而允许编译器推断出正确的T(在这种情况下Box<Foo>)。

consume_func(Box::new(*b));

这是有效的,因为Box<Foo + Send>可以自动强制到Box<Foo>,但Box<Box<Foo + Send>>不能强制到Box<Box<Foo>>


推荐阅读