Esperado enum `std :: result :: Result`, encontrado` () `ao usar o loop for

Nov 26 2020

Estou mexendo em um dos exemplos do projeto de sintetizador de textura :

use texture_synthesis as ts;

fn main() -> Result<(), ts::Error> {
    //create a new session
    let texsynth = ts::Session::builder()
        //load a single example image
        .add_example(&"imgs/1.jpg")
        .build()?;

    //generate an image
    let generated = texsynth.run(None);

    //save the image to the disk
    generated.save("out/01.jpg")
}

Eu gostaria de repetir isso três vezes usando um forloop. Foi assim que pensei que poderia fazer:

use texture_synthesis as ts;

fn main() -> Result<(), ts::Error> {
    for i in 0..3 {
        let texsynth = ts::Session::builder()
            //load a single example image
            .add_example(&"imgs/1.jpg")
            .build()?;

        //generate an image
        let generated = texsynth.run(None);

        //save the image to the disk
        let index: String = i.to_string();
        let outputPath = ["out/", &index, ".jpg"].concat();
        generated.save(outputPath );
    };
}

No entanto, isso me dá o erro:

fn main() -> Result<(), ts::Error> {
  |    ----      ^^^^^^^^^^^^^^^^^^^^^ expected enum `std::result::Result`, found `()`        
  |    |
  |    implicitly returns `()` as its body has no tail or `return` expression

Parece que a função principal está gerando um erro porque não está obtendo um resultado do tipo que deseja. Como eu poderia consertar isso?

Respostas

4 Jmb Nov 26 2020 at 14:42

A mainfunção é definida como fn main() -> Result<(), ts::Error>, o que significa que deve retornar um valor do tipo Result<(), ts::Error>. No código original, isso é realizado pela última linha:

generated.save("out/01.jpg")  // Note the absence of semicolon here

porque generated.saveretorna um valor do tipo correto (a returnpalavra-chave é opcional para a última expressão de uma função em Rust, desde que não haja ponto-e-vírgula após a expressão).

Para corrigir seu problema, você precisará garantir que mainretorne um valor do tipo correto. Isso requer duas mudanças:

  • Se uma chamada para generated.saveretornar um erro, você deverá propagar o erro. Isso é realizado pelo ?operador postfix.
  • Se o loop terminar com sucesso, você deve retornar um valor que significa que está tudo bem. Este valor é Ok(()).

Código completo:

use texture_synthesis as ts;

fn main() -> Result<(), ts::Error> {
    //create a new session

    for i in 1..3{
        let texsynth = ts::Session::builder()
            //load a single example image
            .add_example(&"imgs/1.jpg")
            .build()?;

        //generate an image
        let generated = texsynth.run(None);

        //save the image to the disk
        let index: String = i.to_string();
        let outputPath = ["out/", &index, ".jpg"].concat();
        generated.save(outputPath)?;
    };

    Ok(())
}