Oczekiwano wyliczenia „std :: result :: Result”, znaleziono „()„ podczas używania pętli for

Nov 26 2020

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 forpę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

4 Jmb Nov 26 2020 at 14:42

mainFunkcja 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.savezwraca wartość odpowiedniego typu ( returnsł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 mainzwraca wartość odpowiedniego typu. Wymaga to dwóch zmian:

  • Jeśli wywołanie generated.savezwró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(())
}