4 rust
如何在Rust中将数组切片与矢量进行比较?有问题的代码:
fn parse<R: io::Read>(reader: R, fixed: &[u8]) -> io::Result<bool> {
let mut buf = vec![0; fixed.len()];
match reader.read(&mut buf) {
Ok(n) => Ok(n == fixed.len() && fixed == &mut buf),
Err(e) => Err(e)
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误:
fn parse<R: io::Read>(reader: R, fixed: &[u8]) -> io::Result<bool> {
let mut buf = vec![0; fixed.len()];
match reader.read(&mut buf) {
Ok(n) => Ok(n == fixed.len() && fixed == &mut buf),
Err(e) => Err(e)
}
}
Run Code Online (Sandbox Code Playgroud)
答案必须很简单,但这使我难以理解。
如错误消息所述:
特质
std::cmp::PartialEq<std::vec::Vec<u8>>未实现[u8]
然而,相反的方向被实施:
Ok(n) => Ok(n == fixed.len() && buf == fixed),
Run Code Online (Sandbox Code Playgroud)
此外,您需要将您的参数标记为可变的:mut reader: R。
Read::read_exactn == fixed.len()为您执行检查。
分配一个全为零的向量的效率可能不尽如人意。相反,您可以限制输入并读入向量,随需分配:
fn parse<R>(reader: R, fixed: &[u8]) -> io::Result<bool>
where
R: Read,
{
let mut buf = Vec::with_capacity(fixed.len());
reader
.take(fixed.len() as u64)
.read_to_end(&mut buf)
.map(|_| buf == fixed)
}
Run Code Online (Sandbox Code Playgroud)
切片相等的实现已经比较了两侧的长度,因此在切换到使用组合器的同时,我也删除了该长度。
| 归档时间: |
|
| 查看次数: |
2053 次 |
| 最近记录: |