我试图将读取的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:以下答案仅适用于我尝试过的一些字节数组,但不是全部。事实证明,Debug
,PartialEq
等所有便利特性仅适用于具有&lt; = 32元素的数组,因此可行:
assert_eq!(b"01234567890123456789012345678901", &*byte_vec);
但这不是:
assert_eq!(b"012345678901234567890123456789012", &*byte_vec);
因此您必须在其上调用as_ref()
以使其成为切片,为此实现这些特征:
assert_eq!(b"012345678901234567890123456789012".as_ref(), &*byte_vec);
答案 0 :(得分:5)
您可以写下以下内容:
assert_eq!(byte_str, &*byte_vec);
&*
可能看似无操作,但事实上,Deref
在这里发挥作用并改变了一元*
运算符的含义。因此,&*byte_vec
相当于&*(byte_vec.deref())
,或仅相当于byte_vec.deref()
。