微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

你能为这个内部迭代器制作一个外部迭代器接口吗?

如何解决你能为这个内部迭代器制作一个外部迭代器接口吗?

我在 this article 之后使用“外部”和“内部”。假设我正在编写多列文本呈现库:每一列都应该以循环方式将其下一行写入输出。我想为列编写一个特征(例如,具有不同理由的列),以便确保这种循环写入。

将其编写为“内部”迭代器并不难,它可以将下一行的编写器提供或“推送”到列,请参见下面的示例。但是,最好提供一个“外部”迭代器,让每一列“拉”出它需要的所有行编写器。

struct LineWriter;

trait Column {
    // With an API similar to this one,I can guarantee that columns write to
    // lines in the correct order (by adding a return value that proves that the
    // line was written,but I omitted that for simplicity).
    fn write_to_line(&self,line: &mut LineWriter);
    // But I would prefer an interface similar to this for Columns:
    // fn write(&self,it: impl Iterator<Item=LineWriter>);
}

struct SomeColumn;

impl Column for SomeColumn {
    fn write_to_line(&self,line: &mut LineWriter) { todo!() }
}

fn main() {
    let cols = vec![SomeColumn,SomeColumn];

    for line_number in 0..100 {
        let mut line_writer = LineWriter;
        for w in &cols {
            w.write_to_line(&mut line_writer);
        }
    }

    // In the preferred version,this would become
    // for w in &cols {
    //    let line_writer_it = ??? to be determined ???
    //    w.write(line_writer_it);
    // }
}

Playground

如果我们可以控制列的调用方式(即本例中的 main())以及 LineWriter 结构或其迭代器的外观,是否有办法让内部迭代器接口具有此功能?保证?我认为写入其他行需要在迭代器的 next() 函数中进行。但是沿着这些思路思考,我被卡住了,因为它只会在调用堆栈中更深入,并且永远不会从 next() 返回——它如何在写完第一行后继续写第一列的第二行第二列?。也许解决方案涉及 impl Future<LineWriter> 的迭代器?当然,将行缓冲为 Vec<String> 左右,然后以交错方式编写它们是可能的,但不是我感兴趣的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。