预期枚举`std::result::Result`,在使用for循环时找到`()`

我正在修改纹理合成项目中的一个示例:

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

这听起来像是 main 函数抛出了一个错误,因为它没有得到它想要的类型的结果?我怎么能解决这个问题?

回答

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


以上是预期枚举`std::result::Result`,在使用for循环时找到`()`的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>