无法将“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");
}
这是我使用 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");
}
我尝试 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");
}