rust 为什么这个函数不返回动态图像的变化?

2ledvvac  于 2023-01-05  发布在  其他
关注(0)|答案(1)|浏览(123)

我有一个函数,用来检查命令行参数,并根据输入的内容来改变图像,我知道如何改变for循环作用域之外的图像,但它不返回改变后的图像对象。
我在修改对象和返回它时遇到了麻烦,而且我太缺乏经验,不知道应该如何克服这个问题。

fn commands(args: Vec<String>, img1: &DynamicImage) -> DynamicImage {
        let length = args.len();
        
        let img2 = img1.clone();
       
        for n in 2..length{
                if &args[n] == "90"{
                        img2.rotate90();
                        return img2
                }else if &args[n] == "180"{
                        img2.rotate180(); 
                        return img2      
                }else if &args[n] == "270"{
                        img2.rotate270();
                        return img2
                }else{
                        eprintln!("Invalid input")
                }
                return img2
        }
        return img2
}
wztqucjr

wztqucjr1#

返回的是原始图像,而不是旋转后的图像。我一眼就能看出img2是不可变的,所以不太可能修改当前图像。检查文档后,它确实返回了一个新图像。
下面是一种可以重写它的方法:

fn commands(args: Vec<String>, img: &DynamicImage) -> DynamicImage {
    for arg in &args[2..] {
        match arg.as_ref() {
            "90" => return img.rotate90(),
            "180" => return img.rotate180(),
            "270" => return img.rotate270(),
            _ => eprintln!("Invalid input"),
        }
    }

    img.clone()
}

你可以考虑返回一个Option<DynamicImage>Result<DynamicImage, InvalidDegreesError>(其中InvalidDegreesError是一些自定义的错误类型)来改进功能。另外,如果args字段代表命令行参数,那么你可以考虑使用一个类似clap的crate来处理输入验证。

相关问题