Типаж TryFrom <& [u8]> привязан к трейту - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь реализовать общую черту для группы типов, созданных из двоичных данных (читаемых с диска). Большинство методов трейтов могут использовать реализации по умолчанию и только преобразования и т. Д. c. потребуется реализовать отдельно. Я хотел бы использовать черту TryFrom<&[u8]> для преобразований из двоичных данных в мои типы, но я не знаю, как express (в контексте черты) это время жизни &[u8] и время жизни значений моих типов, созданных из это не связано. Вот минимальный пример проблемы.

use std::convert::TryFrom;

struct Foo;

// Value of Foo can be created from &[u8] but it doesn't borrow anything.
impl TryFrom<&[u8]> for Foo {
    type Error = ();

    fn try_from(v: &[u8]) -> Result<Self, ()> {
        Ok(Foo)
    }
}

trait Bar<'a>
where
    Self: TryFrom<&'a [u8], Error = ()>, // `&` without an explicit lifetime name cannot be used here
{
    fn baz() -> Self {
        let vec = Vec::new();
        Self::try_from(&vec).unwrap() // ERROR: vec does not live long enough (nothing is borrowed)
    }
}

Альтернативным решением было бы преобразование в методы черт, но было бы лучше использовать общие черты std. Есть ли способ добиться этого? (Или я мог бы использовать константные дженерики, но я не хочу полагаться на ночной компилятор.)

1 Ответ

1 голос
/ 13 июля 2020

То, что вы хотите, - это «более высокие границы черт» (HRTB, или просто добрый мальчик ). Они выглядят так: for<'a> T: 'a. Этот пример просто означает: «для каждого возможного времени жизни 'a, T должен ...». В вашем случае:

trait Bar
where
    Self: for<'a> TryFrom<&'a [u8], Error = ()>,

Вы также можете указать это требование как супер-черту, привязанную напрямую вместо предложения where:

trait Bar: for<'a> TryFrom<&'a [u8], Error = ()> { ... }

И да, теперь это просто означает, что все разработчики из Bar должны реализовывать TryFrom<&'a [u8], Error = ()> для всех возможных времен жизни. Это то, что вам нужно.

Рабочая площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...