首页 > 解决方案 > 我可以从自定义类型中借用切片吗?

问题描述

可以将 a 借入Vec<u32>a&Vec<u32>或 a &[u32]。我认为这要归功于AsRefBorrow特征。但是,我无法在我自己的自定义类型上实现这种借用。我在这里吠错树了吗?

use std::borrow::Borrow;

struct MyArray([u32; 5]);

impl MyArray {
    fn new() -> MyArray {
        MyArray([42; 5])
    }
}

impl AsRef<[u32]> for MyArray {
    fn as_ref(&self) -> &[u32] {
        &self.0
    }
}

impl Borrow<[u32]> for MyArray {
    fn borrow(&self) -> &[u32] {
        &self.0
    }
}

fn main() {
    let ma = MyArray::new();
    let _: &[u32] = &ma; // compilation failure
}

标签: rust

解决方案


您正在寻找std::ops::Deref

除了用于*在不可变上下文中使用(一元)运算符进行显式取消引用操作外,Deref编译器在许多情况下也隐式使用。这种机制称为Deref强制”。在可变上下文中,DerefMut使用。

修改后的代码:

use std::ops::Deref;

struct MyArray([u32; 5]);

impl MyArray {
    fn new() -> MyArray {
        MyArray([42; 5])
    }
}

impl Deref for MyArray {
    type Target = [u32];

    fn deref(&self) -> &[u32] {
        &self.0
    }
}

fn main() {
    let ma = MyArray::new();
    let _: &[u32] = &ma;
}

推荐阅读