列挙型 `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(())
}