Erwartete Aufzählung `std :: result :: Result`, gefunden` ()` bei Verwendung der for-Schleife

Nov 26 2020

Ich bastele an einem der Beispiele aus dem Textur-Synth- Projekt:

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

Ich möchte dies dreimal mit einer forSchleife wiederholen . So dachte ich, ich könnte es tun:

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

Dies gibt mir jedoch den Fehler:

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

Das klingt so, als würde die Hauptfunktion einen Fehler auslösen, weil sie kein Ergebnis des gewünschten Typs erhält. Wie könnte ich das beheben?

Antworten

4 Jmb Nov 26 2020 at 14:42

Die mainFunktion ist wie folgt definiert fn main() -> Result<(), ts::Error>, das heißt, es muß einen Wert vom Typ zurück Result<(), ts::Error>. Im ursprünglichen Code wird dies durch die letzte Zeile erreicht:

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

da generated.savegibt einen Wert vom richtigen Typ zurück (das returnSchlüsselwort ist optional für den letzten Ausdruck einer Funktion in Rust, vorausgesetzt, nach dem Ausdruck steht kein Semikolon).

Um Ihr Problem zu beheben, müssen Sie sicherstellen, dass mainein Wert des richtigen Typs zurückgegeben wird. Dies erfordert zwei Änderungen:

  • Wenn ein Aufruf von generated.saveeinen Fehler zurückgibt, sollten Sie den Fehler weitergeben. Dies wird vom ?Postfix-Operator durchgeführt.
  • Wenn die Schleife erfolgreich beendet wurde, sollten Sie einen Wert zurückgeben, der anzeigt, dass alles in Ordnung ist. Dieser Wert ist Ok(()).

Vollständiger Code:

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