我使用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
怎么了?格式问题?
Code:
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();
}
完整代码 https://gitlab.dc.zyxel.com.tw/ZT02777/cassandra-rs-driver
错误说明了一切:
can't capture dynamic environment in a fn item
The fn
有问题的项目是handler
。即使您已在另一个方法中定义了此函数,但使用以下声明的函数fn
(a fn
item) 的编译就像模块顶层的任何其他函数一样。函数无法从其环境中捕获自由变量;他们只能访问其显式参数和静态变量。
该错误继续指出到底是哪个变量有问题:
306 | let out = serde_json::to_string(&cass_it).unwrap();
| ^^^^^^^
变量cass_it
是在封闭函数中定义的,无法从handler
.
错误消息末尾的注释会为您提供如何解决问题的建议:
= help: use the `|| { ... }` closure form instead
一个封闭can从其环境中捕获变量。所以你可以尝试更换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)))
};
The move
关键字将导致闭包取得所有权cass_it
而不是尝试引用外部函数中的变量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)