无法在有关 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();
}

Complete code

错误说明了一切:

can't capture dynamic environment in a fn item

有问题的 fn 项是 handler。即使您在另一个方法中定义了此函数,使用 fnfn 项)声明的函数也会像模块顶层的任何其他函数一样被编译。函数无法从其环境中捕获自由变量;他们只能访问他们的显式参数和静态变量。

错误继续说明问题出在哪个变量上:

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 的所有权,而不是尝试在外部函数中引用变量。