我已经为我的类型实现了AsRef<[u8]>,并使用.as_ref()实现了到&[u8]的自动转换,但是&-operator没有.怎样才能让操作员工作呢?
struct Buffer {
data: Vec<u8>,
}
impl AsRef<[u8]> for Buffer {
fn as_ref(&self) -> &[u8] {
&self.data
}
}
fn print_slice(slice: &[u8]) {
slice.iter().for_each(|b| print!("{:02x}", b));
println!()
}
fn main() {
let buffer = Buffer {
data: b"Testolope".to_vec(),
};
// print_slice(&buffer); // <- This does not work
print_slice(buffer.as_ref()) // <- This works
}error[E0308]: mismatched types
--> src/main.rs:20:17
|
20 | print_slice(&buffer);
| ^^^^^^^ expected slice, found struct `Buffer`
|
= note: expected type `&[u8]`
found type `&Buffer`我想要一个通用的解决方案。其他数据类型(如Vec<u8> )通过使用&-operator支持到&[u8]的转换。如果我能够为我自己的类型工作,这样我就不必每次都使用.as_ref()了,这将是很酷的。
发布于 2018-05-15 15:50:32
不能重载引用运算符,但可以连接到Deref强制:
impl std::ops::Deref for Buffer {
type Target = [u8];
fn deref(&self) -> &Self::Target {
&self.data
}
}在这种情况下,您的原始代码可以工作。
另请参阅:
发布于 2018-05-15 15:30:54
您使用print_slice(&buffer);调用整个结构,但只使用print_slice(buffer.as_ref())调用data字段。如果你把它做成print_slice(&buffer.data),它就能工作了。或者,将print_slice函数的类型签名更改为&Buffer,这将使as_ref()行无法工作。
https://stackoverflow.com/questions/50353904
复制相似问题