首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Box::<_>::new()中指定锈菌箱类型

如何在Box::<_>::new()中指定锈菌箱类型
EN

Stack Overflow用户
提问于 2022-04-04 04:21:25
回答 1查看 178关注 0票数 2

奇怪的是,在下面的代码片段中,第二个函数编译,而不是第三个函数。

代码语言:javascript
复制
pub fn foo1(iter: Box<dyn Iterator<Item = u8>> ) -> Box<dyn Iterator<Item = u8>> {
      Box::new(iter.map(|n| n + 1)) 
} // This compiles

pub fn foo2(iter: Box<dyn Iterator<Item = u8>> ) -> Box<dyn Iterator<Item = u8>> {
    let a: Box::<dyn Iterator<Item = u8>> = Box::<_>::new(iter.map(|n| n + 1));
    a
} // This also compiles

pub fn foo3(iter: Box<dyn Iterator<Item = u8>> ) -> Box<dyn Iterator<Item = u8>> {
    let a: Box::<dyn Iterator<Item = u8>> = Box::<dyn Iterator<Item = u8>>::new(iter.map(|n| n + 1));
    a   
} // This does not compile

我们应该如何在第三个函数中指定Box::<_>::new来使其编译,以及为什么?

游乐场

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-04 04:48:32

在第一个和第二个版本中,您调用的函数不是<Box<dyn Iterator<Item = u8>>>::new()。这个函数是T: Sized,但是dyn Iterator: !Sized。相反,您可以调用<Box<SomeConcreteType>>::new(),并将结果强制到Box<dyn Iterator<Item = u8>>

完全类型归属的版本是:

代码语言:javascript
复制
pub fn foo3(iter: Box<dyn Iterator<Item = u8>>) -> Box<dyn Iterator<Item = u8>> {
    let a: Box<dyn Iterator<Item = u8>> = Box::<
        std::iter::Map<
            Box<dyn Iterator<Item = u8>>, // The original iterator type
            _,                            // The callback type (cannot be named using stable Rust)
        >,
    >::new(iter.map(|n| n + 1))
        as Box<dyn Iterator<Item = u8>>;
    a
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71731994

复制
相关文章

相似问题

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