Я реализую FromStr
для типа и для ошибки, которую хочу вернуть переданное &str
внутри структуры-обертки. Однако для этого требуется, чтобы структура имела ограниченное время жизни для &str
, но это приведет к ошибкам внутри FromStr
, поскольку ее ассоциативный тип Err
не имеет никаких ограничений времени жизни и не может быть изменен. Наконец, невозможно добавить время жизни, привязанное к impl
, поскольку время жизни ничем не ограничено, по крайней мере, теми способами, которые я пробовал. Итак, как мне втиснуть свою обертку в ассоциативный тип?
Для большего контекста вот определения:
pub enum RarityTag {
// ...
}
pub struct ParseRarityTagError<'a>(&'a str);
impl FromStr for RarityTag {
type Err = ParseRarityTagError<'a>;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
// ...
rest => Err(ParseRarityTagError(rest)),
}
}
}
Вы не можете вернуть ошибку со временем жизни, привязанным к строке, которую вам дает FromStr::from_str
. Эта черта не была предназначена для этого. Для поддержки этого пришлось бы определить общий связанный тип с параметром времени жизни, но этого не происходит.
Вам нужна либо другая схема ошибок, которая не зависит от времени жизни, либо использовать встроенный метод/свободную функцию, а не черту Err
.
@kalkronline Да, мне пока придется это сделать. К сожалению, он будет использоваться для анализа компонентов довольно большого файла, но, думаю, мне придется поискать что-то более специализированное при дальнейшей оптимизации производительности. Спасибо за быстрый ответ @kmdreko!
Выделение строки при ошибке, вероятно, совершенно нормально. Это не идеально, но если вы не ожидаете, что вам придется идти по этому пути слишком часто, вам следует пойти по этому пути. Вы всегда можете изменить его позже.