Проблема заключается в том, что вы заимствуете объект obj1
изменяемый в функции split_text
на 'a
время жизни до конца функции main
.
fn main() {
println!("Hello, world!");
let mut test = String::from("12345");
let mut obj1 = Object { // 'a start
text: test.as_mut_str(),
next: None,
};
for i in 0..5 {
obj1 = obj1.split_text(4 - i); // borrow for 'a lifetime,
// Won't work in next iteration
if let Some(obj) = obj1.next.as_ref() { // Won't work
println!("{}", obj.text);
}
}
} // 'a end
Вы хотитезаимствовать его только для функции split_text
, то есть для другого (меньшего) времени жизни - которое вы можете либо исключить, либо указать другое - скажем, 'b
.
struct Object<'a> {
text: &'a str, // no need of mutable slice here
next: Option<Box<Object<'a>>>,
}
impl<'a> Object<'a> {
fn split_text(&mut self, count: usize) { // No lifetime required here
let (part1, part2) = self.text.split_at(count); // no need of temp var and mutable split here
self.text = part1;
let obj2 = Object {
text: part2,
next: None,
};
self.next = Some(Box::new(obj2));
}
}
Явная другая версия времени жизни (простодля полноты):
impl<'a> Object<'a> {
fn split_text<'b>(&'b mut self, count: usize) {
let tmp = &mut self.text;
let (part1, part2) = tmp.split_at(count);
self.text = part1;
let obj2 = Object {
text: part2,
next: None,
};
self.next = Some(Box::new(obj2));
}
}
Также сделайте что-нибудь изменяемое только при необходимости.Я изменил изменяемый фрагмент и разделился на обычный.