@ ответ loganfsmyth объясняет, почему вы получаете это сообщение об ошибке. Есть три способа решить эту проблему в зависимости от ваших ожиданий для append_bar
:
Стать владельцем
Если вы ожидаете, что append_bar
вернет измененную строку и не хочет, чтобы вызывающая сторона была впоследствии можно использовать входную строку:
impl AppendBar for String {
fn append_bar (mut self) -> Self {
self.push_str ("Bar");
self
}
}
let s1 = String::from ("Foo");
let s2 = s1.append_bar();
// println!("s1: {}", s1); // Error: s1 is no longer usable at this point
println!("s2: {}", s2); // Prints "FooBar"
Детская площадка
(Это то же решение, что и ответ @ loganfsmyth).
Взять и clone
Если вы ожидаете, что append_bar
вернет измененную строку и хотите, чтобы вызывающая сторона могла впоследствии использовать исходную строку ввода:
impl AppendBar for String {
fn append_bar (&self) -> Self {
let mut s = self.clone();
s.push_str ("Bar");
s
}
}
let s1 = String::from ("Foo");
let s2 = s1.append_bar();
println!("s1: {}", s1); // Prints "Foo"
println!("s2: {}", s2); // Prints "FooBar"
Playground
Мутировать на месте
Если вы ожидаете, что append_bar
заменит ввод измененной строкой:
impl AppendBar for String {
fn append_bar (&mut self) {
self.push_str ("Bar");
}
}
let mut s1 = String::from ("Foo");
s1.append_bar();
println!("s1: {}", s1); // Prints "FooBar"
Детская площадка