Rust 特殊数组
Rust special array
我想定义接受一个“特殊”数组参数的函数,如下例所示:
[5, 2, [7, -1], 3, [6, [-13, 8], 4]]
此数组是一个非空数组,包含整数或其他“特殊”数组。
接收这种“特殊”数组的函数的正确参数类型应该是什么?
您不能将这样的数组作为函数的参数,因为它不是齐次的。但是,您可以定义自己类型的特殊数组。
下面的代码展示了如何编码一个特殊的数组[2, [2, 2]]:
#[derive(Debug)]
enum Special {
Integer(i32),
Vector(Vec<Special>)
}
fn main() {
let special = Special::Vector(
vec![Special::Integer(2),
Special::Vector(vec![Special::Integer(2), Special::Integer(2)])]
);
println!("{:?}", special);
}
您可以使用模式匹配来检查数组中的枚举元素类型,Integer 或 Vector :
match special {
Special::Integer(val) => println!("I am an integer: {}", val),
Special::Vector(vec) => println!("I have nested element inside: {:?}", vec)
}
要遍历这样的数组,您需要一个可以递归计算的函数,因为 Vector 臂具有 nestef 元素。我们可以这样定义一个递归求值的函数:
fn eval(special: Special) {
match special {
Special::Integer(val) => println!("Integer met {}", val),
Special::Vector(vec) => vec.into_iter().for_each(|special_elem| eval(special_elem))
}
}
值得注意的一件事是,由于我们按值捕获,因此我们会引起移动,因此我们可以安全地使用 into_iter 来确保我们消耗所有值.
我想定义接受一个“特殊”数组参数的函数,如下例所示:
[5, 2, [7, -1], 3, [6, [-13, 8], 4]]
此数组是一个非空数组,包含整数或其他“特殊”数组。
接收这种“特殊”数组的函数的正确参数类型应该是什么?
您不能将这样的数组作为函数的参数,因为它不是齐次的。但是,您可以定义自己类型的特殊数组。
下面的代码展示了如何编码一个特殊的数组[2, [2, 2]]:
#[derive(Debug)]
enum Special {
Integer(i32),
Vector(Vec<Special>)
}
fn main() {
let special = Special::Vector(
vec![Special::Integer(2),
Special::Vector(vec![Special::Integer(2), Special::Integer(2)])]
);
println!("{:?}", special);
}
您可以使用模式匹配来检查数组中的枚举元素类型,Integer 或 Vector :
match special {
Special::Integer(val) => println!("I am an integer: {}", val),
Special::Vector(vec) => println!("I have nested element inside: {:?}", vec)
}
要遍历这样的数组,您需要一个可以递归计算的函数,因为 Vector 臂具有 nestef 元素。我们可以这样定义一个递归求值的函数:
fn eval(special: Special) {
match special {
Special::Integer(val) => println!("Integer met {}", val),
Special::Vector(vec) => vec.into_iter().for_each(|special_elem| eval(special_elem))
}
}
值得注意的一件事是,由于我们按值捕获,因此我们会引起移动,因此我们可以安全地使用 into_iter 来确保我们消耗所有值.