Énumération attendue `std :: result :: Result`, trouvée` () `lors de l'utilisation de la boucle for
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
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(())
}