Скажем, у меня есть черта IMyWriter
, у которой есть функция flush_to_disk
, которая получает итератор частей для записи. Каждая написанная часть должна давать объект Result.
use async_trait::async_trait;
use async_std::prelude::StreamExt;
#[async_trait]
trait IMyWriter<'a> {
async fn flush_to_disk<'b, 'c: 'a + 'b, Iter, Results>(&mut self, pieces: Iter) -> Results
where
Iter: IntoIterator<Item = u64>,
Results: StreamExt<Item=Result<(), std::io::Error>>;
}
У меня проблемы с отображением в реализации:
use async_std::io::File;
use async_trait::async_trait;
struct MyWriter {
file: Mutex<File>;
}
#[async_trait]
impl IMyWriter for MyWriter {
async fn flush_to_disk<'b, 'c: 'a + 'b, Iter, Results>(&mut self, pieces: Iter) -> Results
where
Iter: IntoIterator<Item = u64>,
Results: StreamExt<Item=Result<(), std::io::Error>> {
pieces.into_iter().map(|piece| async {
let f = self.file.lock().await;
// Do I/O on file
Ok()
})
}
}
Это явно жалуется:
type parameter `Results`, found struct `std::iter::Map`
Я не могу понять, как вернуть результаты для потока асинхронных записей, которые происходят.
StreamExt
, а не каждую реализацию признакаStreamExt
, поэтому универсальный тип не работает в этом ситуация (подумайте, если бы пользователь указал тип для универсального параметраResults
, как бы вы могли его вернуть?). Обычно решение этой проблемы состоит в том, чтобы вернутьimpl Trait
из функции, однако это не разрешено в объявлениях признаков, а обходные пути описаны в вопросе, который я ранее отправил, поэтому, надеюсь, вы сможете найти тот, который соответствует вашим потребностям. - person Aplet123   schedule 06.12.2020