如何将 try_future::map_ok::MapOk 添加到 Vec<impl Future>
How to add a try_future::map_ok::MapOk to a Vec<impl Future>
我有这个功能 returns 和 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);
}
为什么这发生在这里而不是第一个函数?为什么编译器的行为不同?
使用 impl SomeTrait
作为函数参数的(部分)类型意味着函数的 调用者 可以选择实际类型。但是在这里,当您调用 futures.push (fim)
时,您试图将特定类型的值放入 futures
中,并且没有理由认为该类型与调用者选择的类型相同。您要么需要在参数中指定 future 的完整类型(这可能会非常麻烦),要么将其装箱:
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));
}
我有这个功能 returns 和 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);
}
为什么这发生在这里而不是第一个函数?为什么编译器的行为不同?
使用 impl SomeTrait
作为函数参数的(部分)类型意味着函数的 调用者 可以选择实际类型。但是在这里,当您调用 futures.push (fim)
时,您试图将特定类型的值放入 futures
中,并且没有理由认为该类型与调用者选择的类型相同。您要么需要在参数中指定 future 的完整类型(这可能会非常麻烦),要么将其装箱:
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));
}