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

您可以使用模式匹配来检查数组中的枚举元素类型,IntegerVector :

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 来确保我们消耗所有值.