首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何重载引用操作符?

如何重载引用操作符?
EN

Stack Overflow用户
提问于 2018-05-15 15:23:18
回答 2查看 517关注 0票数 2

我已经为我的类型实现了AsRef<[u8]>,并使用.as_ref()实现了到&[u8]的自动转换,但是&-operator没有.怎样才能让操作员工作呢?

代码语言:javascript
运行
复制
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
}
代码语言:javascript
运行
复制
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()了,这将是很酷的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-15 15:50:32

不能重载引用运算符,但可以连接到Deref强制:

代码语言:javascript
运行
复制
impl std::ops::Deref for Buffer {
    type Target = [u8];

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

在这种情况下,您的原始代码可以工作。

另请参阅:

票数 4
EN

Stack Overflow用户

发布于 2018-05-15 15:30:54

您使用print_slice(&buffer);调用整个结构,但只使用print_slice(buffer.as_ref())调用data字段。如果你把它做成print_slice(&buffer.data),它就能工作了。或者,将print_slice函数的类型签名更改为&Buffer,这将使as_ref()行无法工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50353904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档