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