Erwartete Aufzählung `std :: result :: Result`, gefunden` ()` bei Verwendung der for-Schleife
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 for
Schleife 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
Die main
Funktion 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.save
gibt einen Wert vom richtigen Typ zurück (das return
Schlü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 main
ein Wert des richtigen Typs zurückgegeben wird. Dies erfordert zwei Änderungen:
- Wenn ein Aufruf von
generated.save
einen 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(())
}