gpt4 book ai didi

rust - 如何处理周期性可变借贷

转载 作者:行者123 更新时间:2023-12-03 11:34:09 26 4
gpt4 key购买 nike

我正在用Rust开发一款小游戏,遇到了不确定的问题。本质上,我想拥有一个具有更新方法的Controller特性。更新方法应接受可变实体引用,并对其自身具有可变引用。问题是我希望实体拥有其 Controller ,这导致我需要进行两次可变的借入。这是Rust Playground链接,展示了我正在尝试做的事情https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=f33f548bb72373f47757092fbb0b615d


trait Controller{
fn update(&mut self, entity: &mut Entity);
}

struct MyController{

}

impl Controller for MyController{
fn update(&mut self, _entity: &mut Entity){

}
}

struct Entity{
controller: Option<Box<dyn Controller>>
}

impl Entity{

fn update(&mut self){
if let Some(controller) = self.controller.as_mut(){
controller.update(self);
}
}
}

fn main() {
let _entity = Entity{
controller: Some(Box::new(MyController{}))
};
}

最佳答案

我发现解决此问题的最佳方法是splitting borrows。除了传递整个Entity之外,您还可以获取Controller.update方法所需的所有内容并将其放在另一个结构中(例如EntityData)。然后,您无需传递整个Entity,而只需传递EntityData
Entity.update方法将如下所示:

impl Entity{
fn update(&mut self){
// Borrow the controller
let controller = &mut self.controller;
// Borrow the entity data
let data = &mut self.data;

if let Some(controller) = controller.as_mut() {
controller.update(data);
}
}
}

Playground Link

在大多数情况下,拆分借用是可行的,因为您实际上并不需要借用该结构的所有字段。在您的情况下,您不需要向 Controller 传递对自身的引用,因此可以借用除此以外的所有内容。

关于rust - 如何处理周期性可变借贷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62253329/

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