代码之家  ›  专栏  ›  技术社区  ›  Michael Snoyman

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

  •  0
  • Michael Snoyman  · 技术社区  · 7 年前

    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 回复  |  直到 7 年前
        1
  •  6
  •   Shepmaster Tim Diekmann    7 年前

    你在找什么 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;
    }
    
    推荐文章