【问题标题】:How to implement iter.collect::<Vec<Vec<_>>>()?如何实现 iter.collect::<Vec<Vec<_>>>()?
【发布时间】:2022-11-02 00:51:36
【问题描述】:

Iterator::collect 可以将迭代器转换为许多不同的结构。所以,我期待 following 能正常工作:

let it = (1..5).map(|x| (x..5));
let xss = it.collect::<Vec<Vec<_>>>();
// let xss = it.map(|xs| xs.collect::<Vec<_>>()).collect::<Vec<_>>(); // clunky 

不幸的是,没有运气。如何实现这样的功能?

【问题讨论】:

    标签: rust iterator


    【解决方案1】:

    您需要的是一个两步程序。首先,你应该创建一个Vec&lt;_&gt; 的迭代器,然后收集它。

    let it = (1..5).map(|x| (x..5).collect());
    let xss = it.collect::<Vec<Vec<_>>>();
    

    请参阅playground


    或者,如果您不能立即修改迭代器:

    let it = (1..5).map(|x| (x..5));
    let xss = it.map(|x| x.collect()).collect::<Vec<Vec<_>>>();
    

    【讨论】:

    • 谢谢你。我的意思是如何实现collect,以便它在一次调用中构建一个嵌套的 vec。
    • 由于orphan rule,您不能,因为要将一个交互器转换为T 类型,T 必须实现FromIterator;并且,在这种情况下,它是实现FromIteratorVec。由于VecFromIterator 都没有在您的板条箱中定义(它们由标准库提供),因此您无法修改它们的行为。
    猜你喜欢
    • 2015-05-23
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多