Rust 处理不同结构借用的多个可变引用
我对生锈还比较陌生,我想通过与活塞的游戏来学习生锈 在那里我有一个渲染场景的Rust 处理不同结构借用的多个可变引用,rust,undefined-behavior,mutable,lifetime,borrow-checker,Rust,Undefined Behavior,Mutable,Lifetime,Borrow Checker,我对生锈还比较陌生,我想通过与活塞的游戏来学习生锈 在那里我有一个渲染场景的渲染器结构和一个处理游戏逻辑事件的主循环。它们都需要一个可变借用,我知道多次借用可能会导致未定义的行为,但我不明白在我的情况下它是如何实现的,因为我总是在不同的范围内使用对象,在同一线程内使用对象 我看了一下这个问题,觉得我应该用Rc和/或RefCell来解决这个问题,但这似乎太极端了。我也不认为我需要渲染器的所有权(或者我需要,为什么?),因为渲染器的寿命比主循环短 另一个解决方案是在每次需要时传递可变对象,但在实际情
渲染器
结构和一个处理游戏逻辑事件的主循环。它们都需要一个可变借用,我知道多次借用可能会导致未定义的行为,但我不明白在我的情况下它是如何实现的,因为我总是在不同的范围内使用对象,在同一线程内使用对象
我看了一下这个问题,觉得我应该用Rc
和/或RefCell
来解决这个问题,但这似乎太极端了。我也不认为我需要渲染器的所有权(或者我需要,为什么?),因为渲染器的寿命比主循环短
另一个解决方案是在每次需要时传递可变对象,但在实际情况中,这几乎适用于每个函数,我来自Java/C++,下面的代码在那里工作
struct Renderer<'a> {
w: &'a mut Window,
}
impl<'a> Renderer<'a> {
fn render(&mut self) {
let w = &mut self.w;
// complex render operation needing the window mutably
}
}
struct Window {
//...
}
impl Window {
fn poll_event(&mut self) {
//some internal code of piston
}
}
fn main() {
let mut w = Window {};
let mut renderer = Renderer { w: &mut w };
loop {
{
//first event handling
w.poll_event();
}
{
//AFTERWARDS rendering
renderer.render();
}
}
}
我的Rc
方法编译得很好,但似乎有些过头了:
use std::rc::Rc;
struct Renderer {
w: Rc<Window>,
}
impl Renderer {
fn render(&mut self) {
let w = Rc::get_mut(&mut self.w).unwrap();
// complex render operation needing the window mutably
}
}
struct Window {
//...
}
impl Window {
fn poll_event(&mut self) {
//some internal code of piston
}
}
fn main() {
let mut w = Rc::new(Window {});
let mut renderer = Renderer { w: w.clone() };
loop {
{
//first event handling
Rc::get_mut(&mut w).unwrap().poll_event();
}
{
//AFTERWARDS rendering
renderer.render();
}
}
}
使用std::rc::rc;
结构渲染器{
w:Rc,
}
impl渲染器{
fn渲染(多个自身(&M){
让w=Rc::get_mut(&mut self.w).unwrap();
//需要可变窗口的复杂渲染操作
}
}
结构窗口{
//...
}
impl窗口{
fn轮询事件(&mut self){
//活塞的一些内部代码
}
}
fn main(){
让mut w=Rc::new(窗口{});
让mut renderer=renderer{w:w.clone()};
环路{
{
//第一事件处理
Rc::get_mut(&mut w).unwrap().poll_event();
}
{
//事后渲染
render.render();
}
}
}
我实际上需要做的就是延迟&mut
。这适用于Rc
,但我不需要所有权-因此所有unwrap
东西都不会失败,因为我(可以)在不同的范围内使用它
在这种情况下,这种困境可以解决吗?还是我必须使用Rc
如果有更“生疏”的方法,请告诉我。我目前正在用活塞制作一个游戏,每次需要时我都会传递可变对象。有一个简单的解决方案,你知道你在做什么,它不会造成任何麻烦。谢谢!,然而,我仍然对使用Cell/RefCell/Box等的解决方案感兴趣,因为我还不太了解用例。否则,很高兴看到我并不是唯一一个构建此模式的人:)您能向我们展示一下您用适当的容器类型替换可变借用的尝试吗?使用
Rc
和RefCell
是一种可能的方法,但您似乎不愿意在问题中使用它们。您得到了两种惯用的解决方案(在需要时通过和Rc
),但您基本上拒绝了这两种解决方案。也许你可以解释你认为什么是习惯性的,所以我们不会去猜测什么样的答案可能被接受。而且,你真的不太可能想要使用<代码> R::GETU-MUT。请参阅和)。我目前正在使用活塞构建一个游戏,每次需要时我都会传递可变对象。有一个简单的解决方案,你知道你在做什么,它不会造成任何麻烦。谢谢!,然而,我仍然对使用Cell/RefCell/Box等的解决方案感兴趣,因为我还不太了解用例。否则,很高兴看到我并不是唯一一个构建此模式的人:)您能向我们展示一下您用适当的容器类型替换可变借用的尝试吗?使用Rc
和RefCell
是一种可能的方法,但您似乎不愿意在问题中使用它们。您得到了两种惯用的解决方案(在需要时通过和Rc
),但您基本上拒绝了这两种解决方案。也许你可以解释你认为什么是习惯性的,所以我们不会去猜测什么样的答案可能被接受。而且,你真的不太可能想要使用<代码> R::GETU-MUT。参见和)。