Как добавить try_future :: map_ok :: MapOk в Ve c - PullRequest
0 голосов
/ 26 марта 2020

У меня есть эта функция, которая возвращает impl Future<Output = Result<Vec<Image>, reqwest::Error>> без каких-либо проблем. Компилятор ни на что не жалуется:

fn future_images<'a>(
    image_ids: &'a str,
    client: &'a Client,
    file_id: &'a str,
    frames: &'a [Node],
    scale: usize,
    format: &'a str,
) -> impl Future<Output = Result<Vec<Image>, reqwest::Error>> + 'a {
    get_images_url_collection(image_ids, client, file_id, scale, format)
        .map_ok(move |urls| to_images(frames, &urls, scale, format))
}

Я тестировал, чтобы добавить это MapOk будущее к вектору фьючерсов внутри функции, но затем я получаю ошибку компилятора, которая говорит expected type parameter impl Future<Output = Result<Vec<Image>, reqwest::Error>> + 'a, found struct futures_util::future::try_future::map_ok::MapOk. Вы можете увидеть код ниже.


fn future_images2<'a>(
    futures: &mut Vec<impl Future<Output = Result<Vec<Image>, reqwest::Error>> + 'a>,
    image_ids: &'a str,
    client: &'a Client,
    file_id: &'a str,
    frames: &'a [Node],
    scale: usize,
    format: &'a str,
) {
    let fim = get_images_url_collection(image_ids, client, file_id, scale, format)
        .map_ok(move |urls| to_images(frames, &urls, scale, format));
    futures.push(fim);
}

Почему это происходит здесь, а не в первой функции? Почему компилятор ведет себя по-другому?

1 Ответ

1 голос
/ 26 марта 2020

Использование impl SomeTrait как (часть) типа для параметра функции означает, что вызывающая сторона функции получает возможность выбрать фактический тип. Однако здесь, когда вы вызываете futures.push (fim), вы пытаетесь поместить указанный тип значения c в futures, и нет причины, по которой этот тип будет таким же, как тип, выбранный вызывающей стороной. Вам нужно будет либо указать полный тип будущего в параметрах (который, вероятно, будет довольно громоздким), либо поставить его в рамку:

fn future_images2<'a> (
    futures: &mut Vec<Box<dyn Future<Output = Result<Vec<Image>>, reqwest::Error>> + 'a>,
    image_ids: &'a str,
    client: &'a Client,
    file_id: &'a str,
    frames: &'a [Node],
    scale: usize,
    format: &'a str,
) {
    let fim = get_images_url_collection (image_ids, client, file_id, scale, format)
        .map_ok (move |urls| to_images (frames, &urls, scale, format));
    futures.push (Box::new (fim));
}
...