gpt4 book ai didi

Rust 闭包错误 -> ...由当前函数拥有 |捕获移动值 :

转载 作者:行者123 更新时间:2023-11-29 08:18:53 26 4
gpt4 key购买 nike

这段代码:

//let seen_cell = std::cell::RefCell::new(window_0);
window_0.connect_delete_event(|_, _| {

//window_0.destroy();
window.hide();
Inhibit(true)
});

button_0.connect_clicked(|_|{
window.show_all();
}
);

产生错误:

error[E0373]: closure may outlive the current function, but it borrows `window`, which is owned by the current function
--> src/main.rs:192:36
|
192 | window_0.connect_delete_event( |_, _| {
| ^^^^^^ may outlive borrowed value `window`
...
195 | window.hide();
| ------ `window` is borrowed here
|
help: to force the closure to take ownership of `window` (and any other referenced variables), use the `move` keyword, as shown:
| window_0.connect_delete_event( move |_, _| {

error[E0373]: closure may outlive the current function, but it borrows `window`, which is owned by the current function
--> src/main.rs:199:30
|
199 | button_0.connect_clicked(|_|{
| ^^^ may outlive borrowed value `window`
200 | window.show_all();
| ------ `window` is borrowed here
|
help: to force the closure to take ownership of `window` (and any other referenced variables), use the `move` keyword, as shown:
| button_0.connect_clicked(move |_|{

如果我尝试这样做:

//let seen_cell = std::cell::RefCell::new(window_0);
window_0.connect_delete_event(move |_, _| {

//window_0.destroy();
window.hide();
Inhibit(true)
});

button_0.connect_clicked(|_|{
window.show_all();
}
);

我得到错误:

error[E0373]: closure may outlive the current function, but it borrows `window`, which is owned by the current function
--> src/main.rs:199:30
|
199 | button_0.connect_clicked(|_|{
| ^^^ may outlive borrowed value `window`
200 | window.show_all();
| ------ `window` is borrowed here
|
help: to force the closure to take ownership of `window` (and any other referenced variables), use the `move` keyword, as shown:
| button_0.connect_clicked(move |_|{

error[E0382]: capture of moved value: `window`
--> src/main.rs:199:30
|
192 | window_0.connect_delete_event(move |_, _| {
| ----------- value moved (into closure) here
...
199 | button_0.connect_clicked(|_|{
| ^^^ value captured here after move
|
= note: move occurs because `window` has type `gtk::Window`, which does not implement the `Copy` trait

如果我尝试这样做:

//let seen_cell = std::cell::RefCell::new(window_0);
window_0.connect_delete_event(move |_, _| {

//window_0.destroy();
window.hide();
Inhibit(true)
});

button_0.connect_clicked(move|_|{
window.show_all();
}
);

我得到错误:

error[E0382]: capture of moved value: `window`
--> src/main.rs:200:9
|
192 | window_0.connect_delete_event(move |_, _| {
| ----------- value moved (into closure) here
...
200 | window.show_all();
| ^^^^^^ value captured here after move
|
= note: move occurs because `window` has type `gtk::Window`, which does not implement the `Copy` trait

我看过类似的问题,但我没能解决这个问题。我怎样才能以最好的方式解决这个问题,也许是使用 Arc 或类似的方法?

最佳答案

我已经使用从 gtk-rs 的一些示例项目中提取的宏解决了上述问题

macro_rules! clone {
(@param _) => ( _ );
(@param $x:ident) => ( $x );
($($n:ident),+ => move || $body:expr) => (
{
$( let $n = $n.clone(); )+
move || $body
}
);
($($n:ident),+ => move |$($p:tt),+| $body:expr) => (
{
$( let $n = $n.clone(); )+
move |$(clone!(@param $p),)+| $body
}
);
}

以我所描述的案例为例:

window_0.connect_delete_event(clone!(window => move |_, _| {

//window_0.destroy();
window.hide();
Inhibit(true)
}));

button_0.connect_clicked(clone!(window => move |_|{
window.show_all();

}));

这是相关部分 window_0.connect_delete_event(clone!(window => move。在我的例子中它也适用于 button_0.connect_clicked 因为 window 后面在类似的地方用到

关于Rust 闭包错误 -> ...由当前函数拥有 |捕获移动值 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43899394/

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