如何将切片与Rust中的向量进行比较?

时间:2017-11-13 15:49:41

标签: 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)
    }
}

我得到的错误:

error[E0277]: the trait bound `[u8]: std::cmp::PartialEq<std::vec::Vec<u8>>` is not satisfied
  --> src/main.rs:32:47
   |
32 |         Ok(n) => Ok(n == fixed.len() && fixed == &mut buf),
   |                                               ^^ can't compare `[u8]` with `std::vec::Vec<u8>`
   |
   = help: the trait `std::cmp::PartialEq<std::vec::Vec<u8>>` is not implemented for `[u8]`

答案必须简单,但这是在逃避我。

1 个答案:

答案 0 :(得分:5)

如错误消息所示:

  

std::cmp::PartialEq<std::vec::Vec<u8>>

未实现特征[u8]

然而,opposite direction is implemented

Ok(n) => Ok(n == fixed.len() && buf == fixed),

此外,您需要将参数标记为可变:mut reader: R

Read::read_exact为您执行n == 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)
}

切片相等的实现已经比较了双方的长度,所以在切换到使用组合器的同时我也删除了它。