无法在有关 iron lib 的 fn 项目中捕获动态环境
Can't capture dynamic environment in a fn item about iron lib
我用的是c/c++驱动的cassandra查询,然后return数据。
所以cass(LinkedList)和cass_it(Vec)都可以显示查询的结果。
但是,我想使用 json 格式将结果显示到网络上,所以我选择使用 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();
}
错误说明了一切:
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
的所有权,而不是尝试在外部函数中引用变量。
我用的是c/c++驱动的cassandra查询,然后return数据。 所以cass(LinkedList)和cass_it(Vec)都可以显示查询的结果。 但是,我想使用 json 格式将结果显示到网络上,所以我选择使用 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();
}
错误说明了一切:
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
的所有权,而不是尝试在外部函数中引用变量。