[英]cannot move out of `guess`, a captured variable in an `Fn` closure Rust
今天我嘗試用 GTK 寫這個 MusicGuesser 來玩,結果出現了這個錯誤:
error[E0507]: cannot move out of `guess`, a captured variable in an `Fn` closure
--> src/main.rs:63:32
|
15 | let mut guess = Arc::new(get_guess());
| --------- captured outer variable
16 |
17 | app.connect_activate(move |app| {
| ---------- captured by this `Fn` closure
...
63 | button.connect_clicked(move |_| {
| ^^^^^^^^ move out of `guess` occurs here
64 | let mut guess = Arc::clone(&guess);
| -----
| |
| variable moved due to use in closure
| move occurs because `guess` has type `Arc<Vec<std::string::String>>`, which does not implement the `Copy` trait
我發現了一些關於這個錯誤的相同問題,但我不明白。 有源代碼: https ://pastebin.com/1pNxEiB5
let guess = Arc::new(get_guess());
let cloned_guess = Arc::clone(&guess);
// ...
app.connect_activate(move |app| {
// ...
button.connect_clicked(move |_| {
let guess = cloned_guess;
// ...
如果您在move ||
閉包,你把它移到那個閉包中。 這意味着在您的情況下,您將整個外部guess
對象移入。
所以你需要先克隆,然后只將克隆的對象移動進去。
不過,您很快就會遇到下一個問題,因為Arc
的內容始終是不可變的。 在 Rust 中,你永遠不能對同一事物有多個可變引用。 因此,為了修改您的guess
,您必須通過Mutex
或類似方法創建內部可變性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.