无法将“Fn”闭包中捕获的外部变量借用为可变的

Cannot borrow captured outer variable in an `Fn` closure as mutable

这是我使用 Rust 的第一天,但​​我想做一些微不足道的事情,但我被卡住了。

我想做的是向 Vector 添加一个结构,然后 return 结果。我正在尝试的是创建一个非常简单的 REST 服务,它将在发布时将数据存储在内存中,并在执行 GET 时 return 所有数据以 JSON 格式存储。

这是我当前的代码:

fn main() {
    let mut server = Nickel::new();
    let mut reservations = Vec::new();

   server.post("/reservations/", middleware! { |request, response|
        let reservation = request.json_as::<Reservation>().unwrap();

        reservations.push(reservation); // <-- error occurs here

        format!("Hello {} {}", reservation.name, reservation.email)

    });

    server.listen("127.0.0.1:3000");
}

我尝试 使用 RefCell,但随后我收到错误消息,即未为 Vec<reservation::Reservation>

实现特征同步

这是一个很好的例子,说明 Rust 如何保护您免受线程不安全的影响。

如果您考虑一下,在您当前的代码中,多个线程可能会尝试在没有任何同步的情况下同时改变 reservations。这是一场数据竞赛,Rust 会抱怨它。

一个可能的解决方案是将 reservations 向量包装到 Mutex 中以获得同步。您还需要一个 Arc(原子引用计数),因为 Rust 无法证明 reservations 会比线程寿命更长。

进行这些更改后,您的代码应如下所示:

use std::sync::{Arc, Mutex};
fn main() {
    let mut server = Nickel::new();
    let reservations = Arc::new(Mutex::new(Vec::new()));

    server.post("/reservations/", middleware! { |request, response|
        let reservation = request.json_as::<Reservation>().unwrap();

        reservations.lock().unwrap().push(reservation); // <-- error occurs here

        format!("Hello {} {}", reservation.name, reservation.email)

    });

    server.listen("127.0.0.1:3000");
}

您可以查看文档以获取有关 Mutex and Arc 的更多信息。