Oczekiwano wyliczenia „std :: result :: Result”, znaleziono „()„ podczas używania pętli for
Majstruję przy jednym z przykładów z projektu syntezatora tekstur :
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")
}
Chciałbym to powtórzyć trzy razy, używając for
pętli. Tak myślałem, że mogę to zrobić:
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 );
};
}
Jednak to daje mi błąd:
fn main() -> Result<(), ts::Error> {
| ---- ^^^^^^^^^^^^^^^^^^^^^ expected enum `std::result::Result`, found `()`
| |
| implicitly returns `()` as its body has no tail or `return` expression
Wygląda na to, że główna funkcja generuje błąd, ponieważ nie uzyskuje wyniku typu, którego chce? Jak mogłem to naprawić?
Odpowiedzi
main
Funkcja definiuje się jako fn main() -> Result<(), ts::Error>
, co oznacza, że powinny powrócić do wartości typu Result<(), ts::Error>
. W oryginalnym kodzie jest to realizowane przez ostatnią linię:
generated.save("out/01.jpg") // Note the absence of semicolon here
ponieważ generated.save
zwraca wartość odpowiedniego typu ( return
słowo kluczowe jest opcjonalne dla ostatniego wyrażenia funkcji w Rust, pod warunkiem, że po wyrażeniu nie ma średnika).
Aby rozwiązać problem, musisz upewnić się, że main
zwraca wartość odpowiedniego typu. Wymaga to dwóch zmian:
- Jeśli wywołanie
generated.save
zwróci błąd, należy go propagować. Jest to realizowane przez?
operator postfiksowy. - Jeśli pętla zakończy się pomyślnie, powinieneś zwrócić wartość, która oznacza, że wszystko jest w porządku. Ta wartość jest
Ok(())
.
Pełny kod:
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(())
}