Параметры времени жизни в границах супертрейта - PullRequest
1 голос
/ 10 апреля 2020

Я пытаюсь определить черту для объекта, который может быть преобразован во фрагмент байтов. По сути, я хочу сказать

trait Foo: AsRef<[u8]> + TryFrom<&[u8]> {}

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

trait Foo<'a>: AsRef<[u8]> + TryFrom<&'a [u8]> {}

Это не имеет особого смысла для я, потому что время жизни 'a связано с возможным вызовом try_from() и не должно быть частью типа объекта. (Реализация try_from() копирует соответствующие байты, поэтому время жизни его параметра действительно не имеет значения.)

Хотя это кажется более общей проблемой, чем просто слайсы; Как вы определяете параметры времени жизни, как это для границ супертрейта? (Очевидно, '_ не работает.) И есть ли лучший / более идиоматический c способ express этого, или я должен прибегнуть к какой-то рулонной пользовательской ерунде, такой как

pub trait TryFromRef<T> { type Error; fn try_from(value: &T) -> Result<Self, Self::Error>; }

?

1 Ответ

1 голос
/ 10 апреля 2020

Признак, связанный с параметром времени жизни, который сохраняется для всех времен жизни, а не для какого-то конкретного времени жизни, может быть указан с помощью так называемой границы ранга с более высоким рейтингом или HRTB. В вашем случае это может выглядеть как

trait Foo: AsRef<[u8]> + for<'a> TryFrom<&'a [u8]> {}

Все, что реализует Foo, должно удовлетворять TryFrom<&'a u8> для любого и всех вариантов 'a, поэтому нет необходимости в жизни на самом Foo.

См. Также

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