Saya mencoba memahami karat berjangka. Aku melakukannya:

#[derive(Debug)]
pub enum ClientError {
    UrlParseError((String, String)),
    BindError
}

pub async fn connect(addr: std::net::SocketAddr) -> impl std::future::Future<Output = std::result::Result<(), ClientError>> {
    let listener = async_std::net::TcpListener::bind(&addr).await;
    let listener = match listener {
        Ok(listener) => listener,
        Err(_) => return Err(ClientError::BindError)
    };
    //Ok(())
    std::future::ready(Ok(()))
}

Saya mendapat

error[E0277]: `std::result::Result<_, ClientError>` is not a future
 --> src/lib.rs:7:53
  |
7 | pub async fn connect(addr: std::net::SocketAddr) -> impl std::future::Future<Output = std::result::Result<(), ClientError>> {
  |                                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `std::result::Result<_, ClientError>` is not a future
  |
  = help: the trait `Future` is not implemented for `std::result::Result<_, ClientError>`

error[E0308]: mismatched types
  --> src/lib.rs:14:5
   |
14 |     std::future::ready(Ok(()))
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected enum `std::result::Result`, found struct `std::future::Ready`
   |
   = note: expected type `std::result::Result<_, ClientError>`
            found struct `std::future::Ready<std::result::Result<(), _>>`
note: return type inferred to be `std::result::Result<_, ClientError>` here
  --> src/lib.rs:11:26
   |
11 |         Err(_) => return Err(ClientError::BindError)
   |                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^

Sejujurnya aku tidak tahu apa yang salah. Saya tidak bisa mengembalikan Result dari masa depan?

Bagaimana saya bisa memperbaikinya?

Saya mencoba mengembalikan hanya Ok(()) dan saya tidak mendapatkan kesalahan kedua

0
Gatonito 5 April 2021, 03:29

1 menjawab

Jawaban Terbaik

Apakah ini bekerja untuk Anda?

#[derive(Debug)]
pub enum ClientError {
    UrlParseError((String, String)),
    BindError
}

pub async fn connect(addr: std::net::SocketAddr) -> Result<(), ClientError> {
    let listener = async_std::net::TcpListener::bind(&addr)
        .await
        .or(Err(ClientError::BindError))?
    ;

    Ok(())
}
1
Dmitry 5 April 2021, 08:00