【问题标题】:Can I borrow a slice from a custom type?我可以从自定义类型中借用切片吗?
【发布时间】:2019-04-14 12:09:33
【问题描述】:

可以将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
}

【问题讨论】:

    标签: rust


    【解决方案1】:

    您正在寻找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;
    }
    
    猜你喜欢
    • 2016-01-12
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    相关资源
    最近更新 更多