Я должен догадаться, поскольку вы не включили MCVE. Ваш код не компилируется с ошибками времени жизни на поверхности. Сигнатура функции, которую вы, вероятно, имели в виду:
fn translate<'a, 'b, S, T>(map: &'a HashMap<T, T>, stream: S) -> impl Iterator<Item = T> + 'a
where
S: Iterator<Item = T> + 'b,
T: Copy + Eq + Hash,
'b: 'a, // Read: "'b outlives 'a"
Поскольку S
может пережить ваше возвращаемое значение, и оно все равно будет действительным. Однако я не вижу никаких преимуществ этого подхода: более длинный срок службы всегда действителен вместо более короткого, вам не нужно явно указывать это. Просто используйте одно время жизни, как показано ниже.
fn translate<'a, S, T>(map: &'a HashMap<T, T>, stream: S) -> impl Iterator<Item = T> + 'a
where
S: Iterator<Item = T> + 'a,
T: Copy + Eq + Hash,
{
stream.map(move |e: T| -> T { *map.get(&e).unwrap_or(&e) })
}
Как видите, вам также не хватает ключевого слова move
, которое абсолютно необходимо для вашего закрытия. В противном случае он может пережить вашу карту, которой владеет функция.
Тем не менее, эта функция довольно плотная. Если вы используете его только в одном месте, может, вообще не вводите его и избавляете от головной боли?