나는 Hyper 0.10을 가진 간단한 메모리 내 URL 단축기를 구현하여 녹을 배우려고 시도하고있다. 나는 나의 핸들러에서 변경 가능한 HashMap
을여 닫으려고에 의해 발생 생각 문제로 실행 해요 :하이퍼 핸들러간에 HashMap을 공유하려면 어떻게합니까?
fn post(mut req: Request, mut res: Response, short_uris: &mut HashMap<&str, &str>) {
let mut body = String::new();
match req.read_to_string(&mut body) {
Ok(_) => {
let key = short_uris.len();
short_uris.insert(&key.to_string(), &body.to_string());
*res.status_mut() = StatusCode::Created;
res.start().unwrap().write(&key.to_string().into_bytes());
},
Err(_) => *res.status_mut() = StatusCode::BadRequest
}
}
fn get(req: Request, mut res: Response, short_uris: &HashMap<&str, &str>) {
match req.uri.clone() {
AbsolutePath(path) => {
match short_uris.get::<str>(&path) {
Some(short_uri) => {
*res.status_mut() = StatusCode::MovedPermanently;
res.headers_mut().set(Location(short_uri.to_string()));
},
None => *res.status_mut() = StatusCode::NotFound
}
},
_ => *res.status_mut() = StatusCode::BadRequest
}
}
fn main() {
let mut short_uris: HashMap<&str, &str> = HashMap::new();
short_uris.insert("/example", "http://www.example.com");
Server::http("0.0.0.0:3001").unwrap().handle(move |req: Request, mut res: Response| {
match req.method {
hyper::Post => post(req, res, &mut short_uris),
hyper::Get => get(req, res, &short_uris),
_ => *res.status_mut() = StatusCode::MethodNotAllowed
}
}).unwrap();
}
src/main.rs:42:40: 42:46 error: the trait bound `for<'r, 'r, 'r> [[email protected]/main.rs:42:47: 48:3 short_uris:std::collections::HashMap<&str, &str>]: std::ops::Fn<(hyper::server::Request<'r, 'r>, hyper::server::Response<'r>)>` is not satisfied [E0277]
src/main.rs:42 Server::http("0.0.0.0:3001").unwrap().handle(move |req: Request, mut res: Response| {
Arc
스레드 사이의 HashMap
를 공유하는 내가 사용해야합니까? 그렇다면 어떻게 생겼을까요? 또한 나는이 문제에 대해 완전히 틀릴 수도있다. 오류 메시지는 나에게 매우 모호합니다.
HashMap을 전역으로 선언하지 않는 이유는 무엇입니까? –
@ Dr.Sahib 나는 일반적으로 전역 상태를 피하려고 노력한다. 또한 글로벌 상태의 사용을 최소화 할 것을 권장하는 다음 SO 게시물을 읽었습니다. http://stackoverflow.com/questions/27791532/how-do-i-create-a-global-mutable-singleton. 그래서 전 세계적인 상태없이 그것을하려고했습니다. – forTruce
그냥 밤에 녹을주의 깊게 살펴보면 여기에 더 좋은 오류 메시지가 나타납니다. "Fn 형을 구현하는 클로저가 예상되지만이 클로저는'FnMut' 만 구현합니다" – krdln