Хотя клонирование - это своего рода опция в моем случае, на самом деле я использую 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.

Ответы на вопрос(2)

Ваш ответ на вопрос