Я знаю, что должен быть способ перенести владение переменной из функции в контекст ее вызова. Это то, что у меня есть:
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()
вы просто передаете структуру сразу же после ее создания, но это очень разочаровывает.