列挙型 `std :: result :: Result`が必要ですが、forループを使用すると`() `が見つかりました

Nov 26 2020

テクスチャシンセプロジェクトの例の1つをいじっています。

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ループを使ってこれを3回繰り返したいと思います。これは私がそれをするかもしれないと私が思った方法でした:

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

これは、main関数が必要な型の結果を取得していないため、エラーをスローしているように聞こえますか?どうすればこれを修正できますか?

回答

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は、が正しいタイプの値を返すことを確認する必要があります。これには2つの変更が必要です。

  • の呼び出しで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(())
}