Rust 在惯用语言中实现容器元素关系的正确方法

Rust 在惯用语言中实现容器元素关系的正确方法,rust,borrow-checker,Rust,Borrow Checker,我知道Rust为什么不喜欢我的代码。然而,我不知道解决这个问题的惯用方法是什么 我是一名C#程序员,虽然我觉得我了解Rust的系统,但我认为我对一些问题的“旧”方法在Rust中根本不起作用 这段代码再现了我遇到的问题,它看起来可能不像惯用的锈迹(或者在C#中看起来也不好): //元素和一些额外数据的“全局”容器 结构容器{ 元素:Vec, 全局上下文数据:i32, //…更多上下文数据字段 } impl容器{ //这只是根据上下文数据计算我需要的任何东西 fn计算上下文数据(&self)->i3

我知道Rust为什么不喜欢我的代码。然而,我不知道解决这个问题的惯用方法是什么

我是一名C#程序员,虽然我觉得我了解Rust的系统,但我认为我对一些问题的“旧”方法在Rust中根本不起作用

这段代码再现了我遇到的问题,它看起来可能不像惯用的锈迹(或者在C#中看起来也不好):

//元素和一些额外数据的“全局”容器
结构容器{
元素:Vec,
全局上下文数据:i32,
//…更多上下文数据字段
}
impl容器{
//这只是根据上下文数据计算我需要的任何东西
fn计算上下文数据(&self)->i32{
//该函数最终将使用元素向量和其他字段,
//然后用它做一些古怪的数学运算。
//这就是我当前将元素存储在容器中的原因
}
}
结构元素{
元素_数据:i32,
//其他领域
}
impl元素{
//我需要一个可变的引用来更新元素_数据,
//以及对容器的引用,以计算需要的内容
//如前所述,此全局上下文数据…包括其他元素
fn更新元素数据(&mut self,一些数据:i32,容器:&container){
self.element\u data*=一些\u数据+容器。计算\u上下文\u数据()//做我需要的任何数学运算
}
}
fn main(){
//让它是可变的,这样我以后可以分配元素
让mut container=container{
元素:vec![],
全局上下文数据:1
};
//构建元素的向量
让元素=向量[
元素{
元素_数据:5
},
元素{
元素_数据:7
}
];
//这很有效
container.elements=元素;
//这是可行的,但容器现在被借用为可变的
对于container.elements.iter_mut()中的元素{
elem.element_data+=1;//当这起作用时
让一些_数据=2;
//我不能在这里借用它作为不可变函数并传递给另一个函数
元素更新元素数据(某些元素数据和容器);
}
}
我理解为什么
elem.更新元素数据(一些数据和容器)不起作用:当我调用
iter\u mut
时,我已经将其作为可变项借用了。也许每个元素都应该有一个对容器的引用?但这样的话,我就不会有更多的机会在借钱检查上突破吗


我认为不可能将我的旧方法引入这个新系统。也许我需要重写整件事。有人能给我指一下正确的方向吗?我刚刚开始使用Rust编程,虽然所有权制度对我来说有一定意义,但我应该“围绕”它编写的代码仍然不太清楚。

我遇到了这个问题: 这让我了解了我的问题

我重新审视了这个问题,并将问题归结为通过同时进行写和读的借用来共享向量。这是铁锈所禁止的。我不想使用
不安全的
绕过借阅检查器。不过,我想知道我应该复制多少数据

我的
元素
,实际上是一个游戏的实体(我正在模拟一个clicker游戏),具有可变和不可变的属性,我将其分解

struct Entity {
    type: EntityType,
    starting_price: f64, 
    ...
    ...
    status: Cell<EntityStatus>
}
struct实体{
类型:EntityType,
起价:f64,
...
...
状态:单元格
}
每次需要更改实体的状态时,我都需要调用
status
字段中的
get
set
方法<代码>实体状态
派生
克隆、复制

我甚至可以将字段直接放在结构上,让它们都是
单元格
s,但是使用它们会很麻烦(大量调用
get
set
),所以我选择了更美观的方法

通过允许自己复制
状态
,编辑并设置它
,我可以永久借用数组两次(
.iter()
而不是
.iter\u mut()


我担心由于复制,性能会很差,但实际上,使用
opt-level=3
编译后,性能相当好。如果出现问题,我可能会将字段更改为
Cell
s或提出另一种方法

我遇到了这个问题: 这让我了解了我的问题

我重新审视了这个问题,并将问题归结为通过同时进行写和读的借用来共享向量。这是铁锈所禁止的。我不想使用
不安全的
绕过借阅检查器。不过,我想知道我应该复制多少数据

我的
元素
,实际上是一个游戏的实体(我正在模拟一个clicker游戏),具有可变和不可变的属性,我将其分解

struct Entity {
    type: EntityType,
    starting_price: f64, 
    ...
    ...
    status: Cell<EntityStatus>
}
struct实体{
类型:EntityType,
起价:f64,
...
...
状态:单元格
}
每次需要更改实体的状态时,我都需要调用
status
字段中的
get
set
方法<代码>实体状态
派生
克隆、复制

我甚至可以将字段直接放在结构上,让它们都是
单元格
s,但是使用它们会很麻烦(大量调用
get
set
),所以我选择了更美观的方法

通过允许自己复制
状态
,编辑并设置它
,我可以永久借用数组两次(
.iter()
而不是
.iter\u mut()

我担心由于复制,性能会很差,但实际上,使用
opt-level=3
编译后,性能相当好。如果有问题