enum`std :: result :: Result`가 필요합니다. for 루프를 사용할 때`()`를 찾았습니다.

Nov 26 2020

텍스처 합성 프로젝트 의 예제 중 하나를 수정하고 있습니다 .

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

for루프를 사용하여 이것을 세 번 반복하고 싶습니다 . 이것이 내가 할 수 있다고 생각한 방법이었습니다.

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

그러나 이것은 나에게 오류를 제공합니다.

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

이것은 원하는 유형의 결과를 얻지 못하기 때문에 주 함수가 오류를 던지는 것처럼 들립니다. 이 문제를 어떻게 해결할 수 있습니까?

답변

4 Jmb Nov 26 2020 at 14:42

main함수는로 정의되며 fn main() -> Result<(), ts::Error>이는 유형 값을 반환 해야 함을 의미합니다 Result<(), ts::Error>. 원래 코드에서 이것은 마지막 줄에 의해 수행됩니다.

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

generated.save올바른 유형의 값을 반환 하기 때문입니다 ( return표현식 뒤에 세미콜론이없는 경우 Rust에서 함수의 마지막 표현식에 대한 키워드는 선택 사항입니다).

문제를 해결 main하려면 올바른 유형의 값 을 반환 하는지 확인해야 합니다. 이를 위해서는 두 가지 변경이 필요합니다.

  • 에 대한 호출이 generated.save오류 를 반환하면 오류를 전파해야합니다. 이것은 ?접미사 연산자에 의해 수행됩니다 .
  • 루프가 성공적으로 완료되면 모든 것이 정상임을 나타내는 값을 반환해야합니다. 이 값은 Ok(())입니다.

전체 코드 :

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