使用 Cursive 在多个闭包中引用一个单元格

Referencing a cell in multiple closures with Cursive

我正在使用 Cursive TUI crate,但我在使用对话框按钮时遇到了问题,因为我想将输入设置为随对话框响应而变化。这是我的代码:

fn prompt_repeat(siv: &mut Cursive) -> bool {
    let input = Cell::new(false);

    siv.add_layer(views::Dialog::text("Do you want to retype the note again?")
        .title("Redo?")
        .button("Yes", |s| {
                input.set(true);
                s.quit();
            })
        .button("No", |s| {
                s.quit();
            }));

    siv.run();

    input.get()
}

这会导致错误 E0373:

error[E0373]: closure may outlive the current function, but it borrows `input`, which is owned by the current function
  --> src/main.rs:94:23
   |
94 |         .button("No", |s| {
   |                       ^^^ may outlive borrowed value `input`
95 |                 input.set(false)
   |                 ----- `input` is borrowed here
   |
note: function requires argument type to outlive `'static`
  --> src/main.rs:89:19
   |
89 |       siv.add_layer(views::Dialog::text("Do you want to retype the note again?")
   |  ___________________^
90 | |         .title("Redo?")
91 | |         .button("Yes", |s| {
92 | |                 input.set(true)
...  |
95 | |                 input.set(false)
96 | |             })
   | |______________^
help: to force the closure to take ownership of `input` (and any other referenced variables), use the `move` keyword
   |
94 |         .button("No", move |s| {
   |                       ++++

我知道这是因为编译器无法知道 input 在闭包使用它之前是否仍然存在,但我不能使用 move 因为我需要再次引用单元格到 return它(我已经试过了,编译器告诉我我多次借用了这个值,这是正确的)。

我应该如何在多个闭包中引用单元格?

我同意@Jmb,我可能会使用Rc引用计数智能指针:

fn prompt_repeat(siv: &mut Cursive) -> bool {
    let input = Rc::new(Cell::new(false));
    let input_2 = input.clone();

    siv.add_layer(
        views::Dialog::text("Do you want to retype the note again?")
            .title("Redo?")
            .button("Yes", move |s| {
                input_2.set(true);
                s.quit();
            })
            .button("No", move |s| {
                s.quit();
            }),
    );

    siv.run();

    input.get()
}