rest - 无法在 `Fn` 闭包中将捕获的外部变量借用为可变的

标签 rest rust nickel

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

我想做的是将结构添加到 Vector,然后返回结果。我正在尝试的是创建一个非常简单的 REST 服务,它将在发布时将数据存储在内存中,并在执行 GET 时以 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");
}

我试过了 this solution使用 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 的更多信息和 Arc .

关于rest - 无法在 `Fn` 闭包中将捕获的外部变量借用为可变的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30559073/

相关文章:

rest - http-only 站点来测试 REST 请求?

java - 使用模拟器通过 Retrofit 将我的 REST API 与 Android Studio 连接起来

web-services - 如何将 Web 服务与 SOAP 和 REST 相关联

javascript - 在 nodejs + express 中验证 URL 以处理错误的请求错误

macros - 在 Rust 宏中操作路径?

vector - 如何将向量复制到另一个位置并重用现有的分配内存?

rust - 如何克隆openssl::ssl::SslStream?

rust - 找不到 nickel.rs 帖子重定向

oauth - 如何获取 Authorization Bearer header ?