Tokio::run
имеет следующую подпись:
pub fn run<F>(future: F)
where
F: Future<Item = (), Error = ()> + Send + 'static,
, что означает, что он принимает Future
, который принимает ()
как Item
и имеет ()
как тип ошибки.
С другой стороны, ваш HelloWorld
impl имеет
type Item = ();
type Error = io::Error;
, что означает, что они несовместимы, вы должны преобразовать io::Error
в ()
каким-то образом.
Я бы предложил использовать map_err
tokio::run(hello_world.map_err(|e| Err(e).unwrap()))
для обработки ошибки на случай, если что-то плохое случится.Конечно, вы можете улучшить обработку ошибок, но это будет работать.
Интересно, что у меня отключен JavaScript в моем браузере, и поэтому я вижу комментарии в Rustdoc на веб-странице:
fn main() {
let addr = "127.0.0.1:1234".parse().unwrap();
let connect_future = TcpStream::connect(&addr);
let hello_world = HelloWorld::Connecting(connect_future);
# let hello_world = futures::future::ok::<(), ()>(());
// Run it
tokio::run(hello_world)
}
#
означает, что Rustdoc не должен печатать эту строку, но должен выполнить ее во время тестирования. Я думаю, что это ошибка / недосмотр, и есть также открытый выпуск и ожидающее исправление . PR был объединен, веб-страница была обновлена.