如何重载参考运算符?

时间:2018-05-15 15:23:19

标签: rust type-conversion

我已为我的类型实施了AsRef<[u8]>,并使用&[u8]自动转换为.as_ref(),但& - 运营商却没有......我怎么能让操作员工作?

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>)支持使用&[u8] - 运算符转换为&。如果我可以为我自己的类型工作,那将是很酷的,这样我就不必每次都使用.as_ref()

2 个答案:

答案 0 :(得分:4)

您不能重载引用运算符,但可以挂钩Deref强制:

impl std::ops::Deref for Buffer {
    type Target = [u8];

    fn deref(&self) -> &Self::Target {
        &self.data
    }
}

您的原始代码适用于此情况。

另见:

答案 1 :(得分:0)

您使用<ResourceDictionary Source="/PresentationFramework.Aero;component/themes/Aero.NormalColor.xaml"/> <ResourceDictionary Source="/PresentationFramework.Classic;component/themes/Classic.xaml"/> <ResourceDictionary Source="/PresentationFramework.Royale;component/themes/Royale.NormalColor.xaml"/> <ResourceDictionary Source="/PresentationFramework.Luna.Homestead;component/themes/Luna.Homestead.xaml"/> <ResourceDictionary Source="/PresentationFramework.Luna.Metallic;component/themes/Luna.Metallic.xaml"/> <ResourceDictionary Source="/PresentationFramework.Zune;component/themes/Zune.NormalColor.xaml"/> 调用整个结构,但仅使用print_slice(&buffer);调用data字段。如果你成功print_slice(buffer.as_ref())它就可以了。或者,将print_slice(&buffer.data)函数的类型签名更改为print_slice,这将使&Buffer行无效。