问题描述
我想在按下按钮时更改按钮的标签。 但是我收到了这个错误信息。
error[E0505]: cannot move out of `but` because it is borrowed
--> src/main.rs:24:22
|
24 | but.set_callback(move || but.set_label("pressed"));
| --- ------------ ^^^^^^^ --- move occurs due to use in closure
| | | |
| | | move out of `but` occurs here
| | borrow later used by call
| borrow of `but` occurs here
error: aborting due to prevIoUs error
代码本身
1 use fltk::*;
2
3 fn main() {
4
5 let app = app::App::default().with_scheme(app::Scheme::Gleam);
6 let mut win = window::Window::default()
7 .with_pos(0,0)
8 .with_size(300,300)
9 .with_label("FLTK_Window");
10 let mut but = button::Button::default()
11 .with_pos(0,0)
12 .with_size(100,50)
13 .center_of(&win)
14 .with_label("BUTTON");
15 win.end();
16 win.show();
17
18 win.set_color(Color::Black);
19 but.set_color(Color::from_rgb(0,100,0));
20 but.set_label_color(Color::White);
21 but.set_label_type(LabelType::normal);
22 but.set_callback(move || but.set_label("pressed"));
23 app.run().unwrap();
24 }
我怎么能处理这种类型的问题?
解决方法
最简单的解决方案是在设置回调之前clone
but
,然后像这样将其移动到闭包中:
use fltk::*;
fn main() {
let app = app::App::default().with_scheme(app::Scheme::Gleam);
let mut win = window::Window::default()
.with_pos(0,0)
.with_size(300,300)
.with_label("FLTK_Window");
let mut but = button::Button::default()
.with_pos(0,0)
.with_size(100,50)
.center_of(&win)
.with_label("BUTTON");
win.end();
win.show();
win.set_color(Color::Black);
but.set_color(Color::from_rgb(0,100,0));
but.set_label_color(Color::White);
but.set_label_type(LabelType::Normal);
but.clone().set_callback(move || but.set_label("PRESSED"));
app.run().unwrap();
}
,
除了 frankenapps 的回答之外,fltk 有一个重载的 set_callback 方法 (set_callback2),它使您可以访问小部件的可变引用。
but.set_callback2(|b| b.set_label("PRESSED"));
如果需要,您也可以使用 move
来捕获外部变量。
更新: 从 fltk-rs 1.0 版本开始,set_callback 默认捕获 &mut self。
but.set_callback(|b| b.set_label("PRESSED"));