如何修改Rust闭包捕获的变量?

如何修改Rust闭包捕获的变量?,rust,imgui,Rust,Imgui,我正在尝试为一个Rust应用程序制作一个GUI,看起来它对我来说会很好用的是。我想要做的就是从用户那里获取一些输入值,然后输出一个不断变化的png。我在启动样板文件时遇到了一些问题,但是提供的存储库工作得很好,足以让hello world演示正常工作,但是当我试图修改它以获取输入并更改显示时,我遇到了所有权问题。我现在要做的是让用户输入一个图像名称,然后打开该文件并在GUI中显示它 以下是我现在拥有的(不包括上面链接的支持代码): struct状态{ 路径:ImString, 形象:布尔, }

我正在尝试为一个Rust应用程序制作一个GUI,看起来它对我来说会很好用的是。我想要做的就是从用户那里获取一些输入值,然后输出一个不断变化的png。我在启动样板文件时遇到了一些问题,但是提供的存储库工作得很好,足以让hello world演示正常工作,但是当我试图修改它以获取输入并更改显示时,我遇到了所有权问题。我现在要做的是让用户输入一个图像名称,然后打开该文件并在GUI中显示它

以下是我现在拥有的(不包括上面链接的支持代码):

struct状态{
路径:ImString,
形象:布尔,
}
状态的impl默认值{
fn default()->Self{
自我{
路径:ImString::具有_容量(128),
你的形象是假的,
}
}
}
fn main(){
让mut system=imgui_support::init(file!());//这来自支持代码
让mut state=state::default();
系统主循环(移动,用户界面){
窗口::新建(im_str!(“你好世界”))
.size([330.0,110.0],imgui::Condition::FirstUseEver)
.position([0f32,0f32],imgui::Condition::FirstUseEver)
.build(用户界面,| |{
ui.input_text(im_str!(“文件路径”),&mut state.path.build();
if ui.small_按钮(im_str!(“提交文件”)){
system.add_img(state.path.to_str());//尝试打开文件并作为纹理进行分析
}
ui.separator();
});
如果state.has_image{
窗口::新建(im_str!(“渲染:”))
.size([720f32,720f32],imgui::Condition::FirstUseEver)
.build(用户界面,| |{
imgui::Image::new(TextureId::new(0),[720f32,720f32])。构建(ui);
});
}
});
}
add\u img
函数是我在
系统
结构上作为一种方法添加的,其定义如下:

pub fn add\u img(&mut self,path:&str)->TextureId{
let纹理:&mut纹理=&mut self.renderer.textures();
让res_img=image::open(path);
匹配resu img{
Ok(图像)=>{
设image=image.to_rgba8();
设dimensions=image.dimensions();
让texture=RawImage2d::from_raw_rgba(image.into_raw(),dimensions);
让gl_texture=Texture2d::new(self.display.get_context(),texture.unwrap();
让纹理=imgui\u glium\u渲染器::纹理{
纹理:Rc::新建(gl_纹理),
采样器:采样器行为{
放大过滤器:放大采样过滤器::线性,
minify_过滤器:MinifySamplerFilter::Linear,
…默认值::默认值()
},
};
纹理。插入(纹理)
}
Err()=>TextureId::new(usize::MAX),
}
}
现在,我得到了使用移动值系统的错误
,无论我如何安排数据,我似乎都无法避免移动错误后的使用


因为我不需要99%的imgui功能,有没有更好的方法来组织我的代码,或者可能是一个不那么健壮的Rust GUI库?

问题是,方法
main\u loop
拥有
系统
。之后,系统将永远无法为您提供

快速修复方法是更新方法
main\u loop
,将
渲染器
显示
传递给闭包。 大概是这样的:

pub fn main_loop<F>(self, mut run_ui: F)
where F: FnMut(&mut bool, &mut Ui, &mut Renderer, &mut glium::Display) + 'static {}
方法
add\u img
应该是一个独立的函数,可以单独使用渲染器和显示,而不依赖于系统

pub fn add_img(path: &str, renderer: &mut Renderer, display: &mut glium::Display) -> TextureId {}

问题是,方法
main\u循环
拥有
系统
的所有权。之后,系统将永远无法为您提供

快速修复方法是更新方法
main\u loop
,将
渲染器
显示
传递给闭包。 大概是这样的:

pub fn main_loop<F>(self, mut run_ui: F)
where F: FnMut(&mut bool, &mut Ui, &mut Renderer, &mut glium::Display) + 'static {}
方法
add\u img
应该是一个独立的函数,可以单独使用渲染器和显示,而不依赖于系统

pub fn add_img(path: &str, renderer: &mut Renderer, display: &mut glium::Display) -> TextureId {}

非常感谢,我还在习惯生锈的这一面。非常感谢,我还在习惯生锈的这一面