我有一个充满u8
的迭代器,我想写入文件或标准输出。在我的迭代器上调用io::stdout().write_all(foo)
给了我一个期望的类型&[u8]
,而我有一个迭代器类型。我明白为什么这不起作用。
我不明白的是如何改变它以使其发挥作用。起初我尝试在我的迭代器的末尾添加.collect()
,但随后它显示the trait bound &[u8]: std::iter::FromIterator<u8> is not satisfied
和a 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()
);
答案 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]);
}
可能有一些方法可以让它更具惯用性,而且我还没有测试边界条件,但希望它可以帮助你。