Могу ли я позаимствовать ломтик из пользовательского типа? - PullRequest
0 голосов
/ 11 ноября 2018

Можно заимствовать 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 Ответ

0 голосов
/ 11 ноября 2018

Вы ищете 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...