Énumération attendue `std :: result :: Result`, trouvée` () `lors de l'utilisation de la boucle for

Nov 26 2020

Je suis en train de bricoler l'un des exemples du projet de texture synth :

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")
}

Je voudrais répéter cela trois fois en utilisant une forboucle. Voici comment je pensais pouvoir le faire:

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 );
    };
}

Cependant, cela me donne l'erreur:

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

Cela ressemble à la fonction principale lève une erreur parce qu'elle n'obtient pas le résultat du type qu'elle veut? Comment pourrais-je résoudre ce problème?

Réponses

4 Jmb Nov 26 2020 at 14:42

La mainfonction est définie comme fn main() -> Result<(), ts::Error>, ce qui signifie qu'elle doit renvoyer une valeur de type Result<(), ts::Error>. Dans le code d'origine, ceci est accompli par la dernière ligne:

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

car generated.saverenvoie une valeur du bon type (le returnmot-clé est facultatif pour la dernière expression d'une fonction dans Rust, à condition qu'il n'y ait pas de point-virgule après l'expression).

Afin de résoudre votre problème, vous devrez vous assurer que mainrenvoie une valeur du bon type. Cela nécessite deux changements:

  • Si un appel à generated.saverenvoie une erreur, vous devez propager l'erreur. Ceci est accompli par l' ?opérateur postfix.
  • Si la boucle se termine avec succès, vous devez renvoyer une valeur qui signifie que tout va bien. Cette valeur est Ok(()).

Code complet:

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(())
}