无法在关于铁库的fn项目中捕获动态环境

时间:2019-01-24 08:43:28

标签: function rust closures iron

我使用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();
}

Complete code

1 个答案:

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