簡體   English   中英

無法移出 `guess`,在 `Fn` 閉包 Rust 中捕獲的變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM