首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法将Box<Box<Foo + Send>>转换为Box<Box<Foo>>?

有没有办法将Box<Box<Foo + Send>>转换为Box<Box<Foo>>?
EN

Stack Overflow用户
提问于 2018-07-20 17:28:59
回答 2查看 125关注 0票数 2

考虑这类守则:

代码语言:javascript
复制
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);
}

它没有编译:

代码语言:javascript
复制
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>>`

BoxBox。由于有胖指针,我无法将Box<Foo>转换为void *

我不能更改consume_func,我宁愿不使用unsafe或其他分配。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-21 00:56:53

虽然您已经声明不能更改consume_func,但其他有类似问题的人可以更改它以接受泛型:

代码语言:javascript
复制
fn consume_func<F: Foo + ?Sized>(b: Box<Box<F>>) {
    unimplemented!();
}
票数 2
EN

Stack Overflow用户

发布于 2018-07-20 18:39:05

这里有一种方法: dereference b (“un”它对一个Box<Foo + Send>),然后立即将它封装到另一个Box<T>中,允许编译器推断正确的T (在本例中是Box<Foo>)。

代码语言:javascript
复制
consume_func(Box::new(*b));

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51447656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档