gpt4 book ai didi

rust - 如何将所有权转移到调用函数?

转载 作者:行者123 更新时间:2023-12-03 11:45:57 25 4
gpt4 key购买 nike

我知道必须有一种方法可以将变量的所有权从函数转移到调用上下文。这是我到目前为止的内容:

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))

我得到“无法通过迭代器在类型为'&Structure'的元素上构建类型为'Vec'的值”。

当我尝试让该函数返回 Vec<Structure>时,出现另一个错误。我觉得我在圈子里奔跑。我知道使用 ::new()构造函数,您只是在创建结构后立即传递了该结构,但这令人非常沮丧。

最佳答案

我不得不将其分解为两个独立的函数,并使我的调用代码来回传递引用,这样就形成了无缝的监管链(例如犯罪现场的证据)。这就是我最终得到的结果:

在我的主要功能内:

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()
}

我仍然认为应该有一个更好的解决方案。

关于rust - 如何将所有权转移到调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60643368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com