比较字节数组和向量

时间:2015-08-28 02:59:24

标签: rust

我试图将读取的Vec个字节与读入Vec的字节进行比较,但我在查找两个类型时遇到问题双方排队。这是我的代码(http://is.gd/goOnYf):

use std::io::{Cursor, Read};
// use std::borrow::Borrow;

fn main() {
    let byte_str = b"This is a byte string";
    let mut byte_vec = Vec::new();

    let mut reader = Cursor::new(byte_str.as_ref());
    reader.read_to_end(&mut byte_vec).unwrap();

    // assert_eq!(byte_str, byte_vec);
    // assert_eq!(byte_str, &byte_vec);
    // assert_eq!(byte_str, byte_vec.as_ref());
    // assert_eq!(byte_str, byte_vec.borrow());

    let bv: &[u8] = &byte_vec;
    assert_eq!(byte_str, bv);
}

在我必须强制使用Vec绑定的let类型并比较它们之前,您可以看到我尝试比较它们的每个失败尝试。

第一个assert_eq!(byte_str, byte_vec)失败了:

`<std macros>:5:8: 5:33 error: the trait `core::cmp::PartialEq<collections::vec::Vec<u8>>` is not implemented for the type `&[u8; 21]`

所以看起来我需要将RHS上的Vec转换为&[u8]。所以我尝试共享引用,并得到相同的错误。然后我尝试了as_ref(),但是(和borrow())需要输入我似乎无法提供内联的注释:

<anon>:13:35: 13:43 error: type annotations required: cannot resolve `collections::vec::Vec<u8> : core::convert::AsRef<_>` [E0283]

是否有一种更简单的方法可以解决这个问题?

更新:在撰写问题时,我确实找到了答案,但它仍然很笨重:

assert_eq!(byte_str, AsRef::<[u8]>::as_ref(&byte_vec));

有更好的方法吗?

更新2:以下答案仅适用于我尝试过的一些字节数组,但不是全部。事实证明,DebugPartialEq等所有便利特性仅适用于具有&lt; = 32元素的数组,因此可行:

assert_eq!(b"01234567890123456789012345678901", &*byte_vec);

但这不是:

assert_eq!(b"012345678901234567890123456789012", &*byte_vec);

因此您必须在其上调用as_ref()以使其成为切片,为此实现这些特征:

assert_eq!(b"012345678901234567890123456789012".as_ref(), &*byte_vec);

1 个答案:

答案 0 :(得分:5)

您可以写下以下内容:

assert_eq!(byte_str, &*byte_vec);

&*可能看似无操作,但事实上,Deref在这里发挥作用并改变了一元*运算符的含义。因此,&*byte_vec相当于&*(byte_vec.deref()),或仅相当于byte_vec.deref()