我可以从自定义类型借用切片吗?

Mic*_*man 2 rust

可以将 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
}
Run Code Online (Sandbox Code Playgroud)

udo*_*rog 6

您正在寻找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;
}
Run Code Online (Sandbox Code Playgroud)