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

时间:2018-11-11 16:37:42

标签: rust

可以将Vec<u32>借入&Vec<u32>&[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
}

1 个答案:

答案 0 :(得分:3)

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

  

除了在不可改变的上下文中使用{一元)*运算符进行显式解引用操作之外,Deref在许多情况下还被编译器隐式使用。该机制称为'Deref coercion'。在可变上下文中,使用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;
}