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
或额外分配。
解决方案
这是一种方法:取消引用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>>
。
推荐阅读
- java - 使用 OpenJDK 11 编译时出现 JasperException
- python - minuit 给出了神秘的 valueError
- c# - NLOG:如何使用变量来指定目标
- android - SSO 到 ChromeOS 上的 Office 365 Android 应用程序
- bazel - Bazel genrules 是否提供临时目录?
- tfs - 跳过本地化资源的编译
- jenkins - 具有算术运算的 Jenkins 流水线
- php - 如何从 ubuntu 中删除未使用的 php 版本?
- spring - 如何在 Thymeleaf 中缩写 HTML 文本
- powershell - 将文件复制到新的目标文件夹,同时保持文件夹结构