Невозможно записать динамическое окружение в элементе fn об Iron lib - PullRequest
0 голосов
/ 24 января 2019

Я использую кассандру драйвера c / c ++ для запроса, а затем возвращаю данные. Следовательно, и 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();
}

Полный код

1 Ответ

0 голосов
/ 25 января 2019

Ошибка говорит само за себя:

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 вместо попытки ссылки на переменную во внешней функции.

...