如何在Rust中将切片与矢量进行比较?

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)

答案必须很简单,但这使我难以理解。

She*_*ter 5

如错误消息所述:

特质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)

切片相等的实现已经比较了两侧的长度,因此在切换到使用组合器的同时,我也删除了该长度。