gpt4 book ai didi

rust - 向量中的每个项目都需要该向量中的所有其他项目时的所有权

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

我对Rust还是很陌生,在这种情况下,我很难弄清楚如何处理所有权(以及生命周期吗?)。我对编程并不陌生,实际上是在重新实现已在JS(https://sheraff.github.io/boids/)中运行的功能。

在这种情况下,Universe基本上是一个包含许多Entity的“模拟”环境。在每个universe.tick()上,每个Entity需要知道它可以“看到”的其他Entity。为此,entity.update()Entity的列表作为参数。
结果,我有一段脚本,看来似乎找不到以下方面的良好所有权结构:

for mut entity in self.entities {
entity.update(&self.entities);
}
您将如何处理?
我可以告诉您我已经尝试过的内容,但是感觉就像我已经尝试了所有我能想到的,包括阅读Rust书,而且我已经收到了所有可能的错误消息...对不起。

PS:当然,及时地,不是以 entity.update传递的实体的完整列表,而是经过过滤的列表。

下面是代码结构的一般简化:
pub struct Entity {
pub point: Point,
vision: Cone,
angle: Angle
}
impl Entity {
pub fn update(&mut self, entities: &Vec<Entity>) {
// ...
}
}

pub struct Universe {
pub entities: Vec<Entity>
}
impl Universe {
pub fn new() -> Universe {
let mut entities: Vec<Entity> = vec![];
for _ in 1..200 {
let mut entity = Entity::new();
entities.push(entity);
}

Universe {
entities
}
}

pub fn tick(&self) {
for mut entity in self.entities {
entity.update(&self.entities);
}
}
}

最佳答案

如果每个实体都需要了解每个实体,那么似乎不是该实体负责更新。您可能应该将实体上的方法重构为可在所有实体上运行的函数。
在嵌套循环中迭代实体有些困难。一种解决方案是遍历该数组的一个副本,并允许另一个循环采用可变引用。

pub fn update_entities(entities: &mut Vec<Entity>) {
for a in entities.clone() {
for mut entity in entities.iter_mut() {
if entity.id == a.id { // If you can compare them, otherwise use indexed for loop and compare indices.
continue;
}
// Do stuff.
}
}
}
之所以需要复制,是因为Rust的黄金法则:您可以使一个可变引用 成为任意数量的不可变引用。嵌套的for循环违反了此规则,因为您需要一个可变的引用和一个不可变的引用。

关于rust - 向量中的每个项目都需要该向量中的所有其他项目时的所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63319359/

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