我想定義一個函式,它接受一個“特殊”陣列的引數,如下例所示:
[5, 2, [7, -1], 3, [6, [-13, 8], 4]]
該陣列是一個非空陣列,包含整數或其他“特殊”陣列。
接收這種“特殊”陣列的函式的正確引數型別應該是什么?
uj5u.com熱心網友回復:
您不能將這樣的陣列作為函式的引數,因為它不是同質的。但是,您可以定義自己的特殊陣列型別。
下面的代碼展示了如何編碼一個特殊的陣列[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來確保我們消耗所有值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/444848.html
上一篇:遍歷json物件結構包含陣列
