Хоть я и поумнел с жизнями, но компилятор меня снова учит...
ошибка [E0521]: заимствованные данные выходят за пределы метода
играть
pub struct Bugger<S> {
pub items: S,
}
impl<S> Bugger<S>
where
&'static S: IntoIterator + 'static,
<&'static S as IntoIterator>::Item: AsRef<u8>,
{
fn do_something_with_items(&self) -> impl Iterator<Item = u8> {
(&self.items).into_iter().map(|b| *b.as_ref())
}
}
Я хочу принять общий член, который реализует IntoIterator по своей ссылке, а затем использовать его в другом методе, на самом деле это черта, но даже это терпит неудачу.
Основная причина, по которой это не удается скомпилировать, заключается в том, что вы берете &self
(который должен быть действителен для любого времени жизни), но привязка блока реализации требует, чтобы IntoIterator
был реализован для ссылки со временем жизни 'static
. Таким образом, способ использования этой привязки в методе требует, чтобы ссылка &self
также была 'static
, но вы этого не указали. Вы можете исправить этот конкретный пример, используя метод &'static self
.
Однако, скорее всего, это не то, что вам нужно. Скорее всего, вы хотите, чтобы жизнь была короче 'static
. Вы можете описать это с помощью признака, связанного с признаком более высокого ранга (HRTB).
Вам также необходимо указать в возвращаемом типе, что возвращаемый итератор заимствован у self
, что можно сделать, добавив анонимное время жизни '_
к границе.
pub struct Bugger<S> {
pub items: S,
}
impl<S> Bugger<S>
where
for<'a> &'a S: IntoIterator,
for<'a> <&'a S as IntoIterator>::Item: AsRef<u8>,
{
fn do_something_with_items(&self) -> impl Iterator<Item = u8> + '_ {
(&self.items).into_iter().map(|b| *b.as_ref())
}
}
Обратите внимание, что время жизни анонима — это всего лишь синтаксический сахар:
fn do_something_with_items<'a>(&'a self) -> impl Iterator<Item = u8> + 'a
Следующий уровень... более высокий рейтинг. Спасибо!