Возьмите на себя ответственность за закрытие аргумента для ржавчины будущего в and_then - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь прочитать все содержимое файла из вектора, используя asyn c rust api:

    let mut content : Vec<u8> = vec![];
    let f = tokio::fs::File::open("myfilecontent")
        .and_then(|mut myfile| {
            myfile.read_buf(&mut content)
        });
    f.await;

Но я продолжаю получать эту ошибку: error[E0515]: cannot return value referencing function parameter `myfile`

Это звучит разумно, потому что будущее, возвращаемое закрытием, должно сохранять ссылку на файл, но поскольку это закрытие является единственным пользователем файла, он может стать владельцем. Как я могу убедить ржавчину сделать правильные вещи?

1 Ответ

1 голос
/ 13 апреля 2020

Вы можете использовать блок async move следующим образом:

use futures::TryFutureExt;
use tokio::io::AsyncReadExt;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut content: Vec<u8> = vec![];

    let f = tokio::fs::File::open("myfilecontent").and_then(
        |mut myfile| async move { myfile.read_buf(&mut content).await },
    );

    f.await?;

    Ok(())
}

или пропустить and_then и go прямо на .await:

use tokio::io::AsyncReadExt;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut content: Vec<u8> = vec![];

    let mut myfile = tokio::fs::File::open("myfilecontent").await?;
    myfile.read_buf(&mut content).await?;

    Ok(())
}
...