У меня есть структура с функцией next()
(похожей на итераторы, но не на итератор). Этот метод возвращает следующее состояние после модификации (сохранение исходного состояния). Итак: fn next(&A) -> A
.
Я начал с простой структуры, где мне не требовалось время жизни (структура A в примере), и я расширил ее, добавив ссылку на новую структуру (структура B).
Проблема в том, что мне теперь нужно указать время жизни для моей структуры и почему-то мой метод next()
больше отказывается работать.
Я подозреваю, что время жизни новой структуры каждой итерации ограничено областью, в которой она создается, и я не могу перемещать ее за пределы этой области.
Можно ли сохранить поведение моего метода next()
?
#[derive(Clone)]
struct A(u32);
#[derive(Clone)]
struct B<'a>(u32, &'a u32);
impl A {
fn next(&self) -> A {
let mut new = self.clone();
new.0 = new.0 + 1;
new
}
}
impl<'a> B<'a> {
fn next(&self) -> B {
let mut new = self.clone();
new.0 = new.0 + 1;
new
}
}
fn main() {
let mut a = A(0);
for _ in 0..5 {
a = a.next();
}
let x = 0;
let mut b = B(0, &x);
for _ in 0..5 {
b = b.next();
}
}
Ошибка:
error[E0506]: cannot assign to `b` because it is borrowed
--> src/main.rs:31:9
|
31 | b = b.next();
| ^^^^-^^^^^^^
| | |
| | borrow of `b` occurs here
| assignment to borrowed `b` occurs here