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