如何修正下面的Rust代码?(闭包相关)

如题,下面的代码在编写的过程中遇到了问题(因为是rust小白所以没整明白闭包的相关概念)

我在试图同时注册两个热键,但是发现无论怎么改都没法在不报错的前提下实现……有没有人能教教我 :xk:

(Rsut圣经没看的很明白)

fn reg_hotkeys(exe_path: PathBuf) {
    println!("Start Hotkey.");
    let res_path = exe_path.clone();
    LControlKey.bind( move|| {
        println!("LControl");
        LAltKey.bind(move|| {
            println!("LAlt");
            while SKey.is_pressed() {
                println!("S");
                let _ = Command::new(res_path.clone()).spawn().unwrap();
            }
            while WKey.is_pressed() {
                println!("W");
                let _ = Command::new(res_path.clone())
                    .arg("--pin:clipboard")
                    .spawn()
                    .unwrap();
            }
        });
    });
}

附Rust圣经在闭包概念这里的教程链接
https://course.rs/advance/functional-programing/closure.html

我不知道 .bind 的原型是 FnOnce / FnMut / Fn 中的哪个,这里就猜测是 Fn 了。Fn 的特性是可以被以不可变引用多次调用

下面会在注释里写可能的问题。

fn reg_hotkeys(exe_path: PathBuf) {
    println!("Start Hotkey.");
    let res_path = exe_path.clone();  // 这个不需要,上面的 exe_path 可以直接移动到第一个 bind,除非说你需要在第一个 bind 后面继续使用。
    LControlKey.bind( move|| { // 当前闭包已经有 exe_path 的所有权,但是由于 Fn 的特性,只能在其中获得 *不可变引用* 的 exe_path,如果是 FnMut 就是 *可变引用*,FnOnce 是则是直接拥有所有权
        println!("LControl");
        // 在这里对 exe_path 进行 clone 理论上应该能解决问题。
        // let exe_path = exe_path.clone();
        LAltKey.bind(move|| { // 在这里再一次尝试 *移动* exe_path,但是在上一个闭包中 *无法获取到* exe_path 的所有权。
            // 你可以这样思考,如果第一次调用最外面的 bind 的闭包就将 exe_path 移动到第二个闭包,那么第二次调用最外面的的 bind 的闭包,exe_path 从哪里来呢
            println!("LAlt");
            while SKey.is_pressed() {
                println!("S");
                let _ = Command::new(res_path.clone()).spawn().unwrap();
            }
            while WKey.is_pressed() {
                println!("W");
                let _ = Command::new(res_path.clone())
                    .arg("--pin:clipboard")
                    .spawn()
                    .unwrap();
            }
        });
    });
}

谢谢大佬,确实是fn,package是 inputbot = "0.6"
函数定义在此

能跑了!!!