Указанная вами документация curl основана на методе curl::easy::Easy::write_function
. Как описано, эта функция принимает замыкание с ограничением времени жизни 'static
, другими словами, оно должно продолжаться на протяжении всей программы.
Это означает, что любые значения, заимствованные таким замыканием, никогда не могут быть возвращены, потому что замыкание никогда не выходит за рамки.
Это связано с тем, что библиотека curl rust оборачивает библиотеку curl C, а библиотека C позволяет вызывающей стороне регистрировать функции обратного вызова для различных событий. Компилятор ржавчины не может отследить время жизни замыканий после того, как они были переданы в качестве функций обратного вызова в библиотеку C, поэтому единственным безопасным временем жизни является 'static
.
Чтобы обойти это, curl
модуль предоставляет объект Transfer
, для которого вы можете зарегистрировать замыкания, которые имеют время жизни менее 'static
. Transfer
объект заботится о регистрации и отмене регистрации обратных вызовов в базовой библиотеке C с учетом их времени жизни.
Узнав это, рассмотрите пример кода:
{
let mut transfer = handle.transfer();
transfer.write_function(|new_data| {
data.extend_from_slice(new_data);
Ok(new_data.len())
}).unwrap();
transfer.perform().unwrap();
}
ЗдесьЗатвор непостоянно занимает data
. Закрытие передается в transfer.write_function
, что требует, чтобы оно длилось столько же, сколько и сам объект передачи. Следовательно, data
заимствовано до конца блока, в котором было объявлено transfer
.