你如何编写一个文件或标准输出(任何实现写入)的迭代器?

时间:2017-01-14 18:51:02

标签: io iterator rust

我有一个充满u8的迭代器,我想写入文件或标准输出。在我的迭代器上调用io::stdout().write_all(foo)给了我一个期望的类型&[u8],而我有一个迭代器类型。我明白为什么这不起作用。

我不明白的是如何改变它以使其发挥作用。起初我尝试在我的迭代器的末尾添加.collect(),但随后它显示the trait bound &[u8]: std::iter::FromIterator<u8> is not satisfieda collection of type &[u8] cannot be built from an iterator over elements of type u8

当Read提供一个返回迭代器的bytes()函数时,Write似乎没有提供一种用迭代器编写的方法,这似乎很奇怪。这样做的惯用方法是什么?

这是我的主要功能内容:

io::stdout().write_all(
    io::stdin().bytes().map(
        |x| match x {
            Ok(b) => b,
            _ => panic!("There was an error reading from stdin"),
        }
    ).repeat(3).collect()
);

2 个答案:

答案 0 :(得分:0)

问题是您要构建Vec<u8>,但是正在尝试创建Vec<&u8>。您可以执行以下操作:

fn main() {
    let array = [1u8, 2, 3];
    let vector: Vec<u8> = array.iter().map(|i| *i).collect();
}

请注意允许.map(|i| *i)引用&u8值的u8部分。

答案 1 :(得分:0)

  

Write提供一个返回迭代器的Read函数时,bytes()没有提供一种使用迭代器的写法,这似乎很奇怪。这样做的惯用方法是什么?

确实感觉不一致,但你当然可以自己写出等价物。

类似的东西:

fn write_all<W: Write, I: Iterator<Item=u8>>(writer: &mut W, iter: I) {
    const SIZE: usize = 1024;

    let mut buffer = [0u8; SIZE];
    let mut index = 0;

    for i in iter {
        buffer[index] = i;

        index += 1;
        if index == SIZE {
            writer.write_all(&buffer);
        }
    }

    writer.write_all(&buffer[..index]);
}

可能有一些方法可以让它更具惯用性,而且我还没有测试边界条件,但希望它可以帮助你。