【发布时间】:2021-06-07 18:57:20
【问题描述】:
这是How to re-use a value from the outer scope inside a closure in Rust?的延续,为了更好的展示,打开了新Q。
// main.rs
// The value will be modified eventually inside `main`
// and a http request should respond with whatever "current" value it holds.
let mut test_for_closure :Arc<RefCell<String>> = Arc::new(RefCell::from("Foo".to_string()));
// ...
// Handler for HTTP requests
// From https://docs.rs/hyper/0.14.8/hyper/service/fn.service_fn.html
let make_svc = make_service_fn(|_conn| async {
Ok::<_, Infallible>(service_fn(|req: Request<Body>| async move {
if req.version() == Version::HTTP_11 {
let foo:String = *test_for_closure.borrow();
Ok(Response::new(Body::from(foo.as_str())))
} else {
Err("not HTTP/1.1, abort connection")
}
}))
});
不幸的是,我收到了RefCell<std::string::String> cannot be shared between threads safely:
【问题讨论】:
-
你克隆你的 Arc 吗?这部分在您的代码中不可见。见cloning Arc references。
-
请将错误复制为问题中的文本。不要将它们作为屏幕截图包含在内:图像可能难以阅读,具体取决于查看者的屏幕分辨率,并且其他有类似问题的人无法搜索。