我能从自定义类型中借用一个片段吗?

3

可以将 Vec<u32> 借用为 &Vec<u32> 或者 &[u32]。我曾以为这是由于 AsRef 或者 Borrow 特性导致的。然而,我无法在自己的自定义类型上实现这样的借用。我是否走错了方向?

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个回答

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;
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接