我使用c / c ++驱动程序的cassandra进行查询,然后返回数据。 因此,cass(LinkedList)和cass_it(Vec)都可以显示查询结果。 但是,我想使用json格式将结果显示到Web上,所以我选择使用vec重新组装数据。但是,有一个问题:
error[E0434]: can't capture dynamic environment in a fn item
--> src/main.rs:306:42
|
306 | let out = serde_json::to_string(&cass_it).unwrap();
| ^^^^^^^
|
= help: use the `|| { ... }` closure form instead
怎么了?格式问题?
代码:
fn main() {
let mut cass = unsafe { cass_connect() };
let mut cass_it = Vec::new();
for cc in cass.iter() {
cass_it.push(cc);
}
println!("{:?}", cass_it);
let mut router = Router::new();
let localhost = "localhost:3009".to_string();
fn handler(req: &mut Request) -> IronResult<Response> {
// convert the response struct to JSON
let out = serde_json::to_string(&cass_it).unwrap();
let content_type = "application/json".parse::<Mime>().unwrap();
Ok(Response::with((content_type, status::Ok, out)))
}
router.get("/", handler, "index");
info!("Listening on {}", localhost);
Iron::new(router).http(localhost).unwrap();
}
答案 0 :(得分:1)
错误说明了一切
can't capture dynamic environment in a fn item
有问题的fn
项目是handler
。即使您已在另一个方法中定义了此函数,也像在模块顶层的任何其他函数一样,编译了用fn
(项fn
)声明的函数。函数无法从其环境中捕获自由变量;他们只能访问其显式参数和静态变量。
错误继续确切说明问题所在的变量:
306 | let out = serde_json::to_string(&cass_it).unwrap(); | ^^^^^^^
变量cass_it
在封闭函数中定义,无法从handler
访问。
错误消息末尾的注释将为您提供有关解决问题的建议:
= help: use the `|| { ... }` closure form instead
闭包可以从其环境中捕获变量。因此,您可以尝试用闭包代替fn
:
let handler = move |req: &mut Request| {
// convert the response struct to JSON
let out = serde_json::to_string(&cass_it).unwrap();
let content_type = "application/json".parse::<Mime>().unwrap();
Ok(Response::with((content_type, status::Ok, out)))
};
move
关键字将导致闭包获得cass_it
的所有权,而不是尝试在外部函数中引用变量。