为什么此函数不会返回突变的动态图像?



我有一个函数,它应该检查命令行参数,并根据输入的内容改变图像。我知道如何在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
}

返回原始图像,而不是旋转后的图像。我一眼就能看出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来处理输入验证。

最新更新