这是我第一天使用 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");
}
关于rest - 无法在 `Fn` 闭包中将捕获的外部变量借用为可变的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30559073/