Я пытаюсь определить черту для объекта, который может быть преобразован во фрагмент байтов. По сути, я хочу сказать
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>; }
?