Как я могу передать право собственности на вызывающую функцию? - PullRequest
0 голосов
/ 11 марта 2020

Я знаю, что должен быть способ перенести владение переменной из функции в контекст ее вызова. Это то, что у меня есть:

fn get_transferables(creep: &Creep) -> &Vec<Structure> {
    let targets = creep.room().find(find::STRUCTURES);
    &targets
        .iter()
        .filter(|s| {
            use Structure::*;
            match s {
                Extension(s) => s.store_free_capacity(Some(ResourceType::Energy)) > 0,
                Spawn(s) => s.store_free_capacity(Some(ResourceType::Energy)) > 0,
                Tower(s) => s.store_free_capacity(Some(ResourceType::Energy)) > 0,
                _ => false,
            }
        })
        .collect::<Vec<&Structure>>()
        .iter()
        .map(|&element| Structure::from(*element))
        .collect()
}

Я получаю сообщение об ошибке «невозможно выйти из общей ссылки», когда я пытаюсь разыменовать элемент, и «невозможно вернуть ссылку на временное значение».

Если я закомментирую эти строки:

// .collect::<Vec<&Structure>>()
// .iter()
// .map(|&element| Structure::from(*element))

я получаю "значение типа 'Ve c' не может быть построено из итератора над элементами типа '& Structure'".

Когда я пытаюсь вернуть функцию Vec<Structure>, я получаю еще одну ошибку. Я чувствую, что бегаю кругами. Я знаю, что с помощью функций-конструкторов ::new() вы просто передаете структуру сразу же после ее создания, но это очень разочаровывает.

1 Ответ

1 голос
/ 11 марта 2020

Мне пришлось разбить его на две отдельные функции, и мой код вызова передавал ссылки туда и обратно, чтобы была бесшовная цепь опеки (например, улики на месте преступления). Вот чем я закончил:

Внутри моей основной функции:

let structures = get_structures(&self);
let transferables = get_transferables(&structures);

Мои новые функции:

fn get_structures(creep: &Creep) -> Vec<Structure> {
    creep.room().find(find::STRUCTURES)
}

fn get_transferables<'a>(targets: &'a Vec<Structure>) -> Vec<&'a Structure> {
    targets
        .iter()
        .filter(|s| {
            use Structure::*;
            match s {
                Extension(s) => s.store_free_capacity(Some(ResourceType::Energy)) > 0,
                Spawn(s) => s.store_free_capacity(Some(ResourceType::Energy)) > 0,
                Tower(s) => s.store_free_capacity(Some(ResourceType::Energy)) > 0,
                _ => false,
            }
        })
        // .collect::<Vec<&Structure>>()
        // .iter()
        // .map(|&element| Structure::from(*element))
        .collect()
}

Я все еще думаю, что должно быть лучшее решение .

...