Хотя клонирование - это своего рода опция в моем случае, на самом деле я использую Arc, поэтому теперь добавлю дополнительные накладные расходы на синхронизацию.
отаю сLinkedList
и я хочу удалить все элементы, которые не проходят проверку. Тем не менее, я сталкиваюсь с ошибкойcannot move out of borrowed content
.
Насколько я понимаю, это потому, что я работаю с&mut self
поэтому я не имею права лишать законной силы (то есть перемещать) одно из содержащихся значений даже на мгновение для создания нового списка его значений.
В C ++ / Java я просто повторял бы список и удалял все элементы, которые соответствуют критериям. Поскольку я не нашел ни одного удаления, я интерпретировал его как итерацию, фильтрацию и сбор.
Цель состоит в том, чтобы избежать создания временного списка, клонирования значений и необходимости принятияself
и вернуть «новый» объект. Я построил пример, который выдает ту же ошибку.Игровая площадка.
use std::collections::LinkedList;
#[derive(Debug)]
struct Example {
list: LinkedList<i8>,
// Other stuff here
}
impl Example {
pub fn default() -> Example {
let mut list = LinkedList::new();
list.push_back(-5);
list.push_back(3);
list.push_back(-1);
list.push_back(6);
Example { list }
}
// Simmilar idea, but with creating a new list
pub fn get_positive(&self) -> LinkedList<i8> {
self.list.iter()
.filter(|&&x| x > 0)
.map(|x| x.clone())
.collect()
}
// Now, attempt to filter the elements without cloning anything
pub fn remove_negative(&mut self) {
self.list = self.list.into_iter()
.filter(|&x| x > 0)
.collect()
}
}
fn main() {
let mut e = Example::default();
println!("{:?}", e.get_positive());
println!("{:?}", e);
}
В моем случае я не могу просто использовать объект-обертку, потому что на него нужно ссылаться из разных мест и он содержит другие важные значения.
В моем исследовании я нашел некоторыенебезопасный код что приводит меня к вопросу, может ли быть построена безопасная функция для выполнения этого действия аналогичноstd::mem::replace
.