Rust 展平嵌套结构

Rust 展平嵌套结构,rust,Rust,寻找解决Rust中借用检查器/使用寿命问题的智慧。我正在尝试将一个通用的嵌套结构展平(变成一个impl迭代器或Vec)。可能有一些&s和`远离工作: fn iter_els(prev_result: Vec<&El>) -> Vec<&El> { // Iterate over all elements from a tree, starting at the top-level element. let mut result = p

寻找解决Rust中借用检查器/使用寿命问题的智慧。我正在尝试将一个通用的嵌套结构展平(变成一个impl迭代器或Vec)。可能有一些&s和`远离工作:

fn iter_els(prev_result: Vec<&El>) -> Vec<&El> {
    // Iterate over all elements from a tree, starting at the top-level element.
    let mut result = prev_result.clone();

    for el in prev_result {
        for child in &el.children {
            result.push(&child.clone());
        }
        result.extend(iter_els(&el.children));
    }
    result
}
fn iter\u els(上一个结果:Vec)->Vec{
//从顶层元素开始,迭代树中的所有元素。
让mut result=prev_result.clone();
对于上一个结果中的el{
适用于未成年儿童&el.children{
result.push(&child.clone());
}
结果扩展(iter_els和el.children));
}
结果
}
您会注意到,这引发的直接例外是,iter_els期望的是ref的Vec,而不是ref本身。当直接解决这一问题时,其他问题就会恶作剧,就像一场氧化但安全的怪胎游戏


这项任务有多种解决方案。一种方法是将结果作为out参数传递给函数:

fn iter_els<'el>(el_top: &'el El, result: &mut Vec<&'el El>) {
    result.push(el_top);
    for el in &el_top.children {
        iter_els(el, result);
    }
}

fn main() {
    // build top_el as you did
    let mut result = Vec::new();
    iter_els(&top_el, &mut result);
    println!("{:?}", result);
}
fn iter\u els(上一个结果:&Vec){
//从顶层元素开始,迭代树中的所有元素。
让mut result=prev_result.clone();
对于上一个结果中的el{
适用于未成年儿童&el.children{
结果:推送(&child);
}
extend(iter_els(&el.children.iter().collect());
}
结果
}
fn main(){
//像你做的那样建造顶级建筑
println!(“{:?}”,iter_els(&vec![&top_el]);
}
或者:

fn iter_els<'el>(prev_result: &'el Vec<El>) -> Vec<&'el El> {
    // Iterate over all elements from a tree, starting at the top-level element.
    let mut result : Vec<_> = prev_result.iter().collect();

    for el in prev_result {
        for child in &el.children {
            result.push(child);
        }
        result.extend(iter_els(&el.children));
    }
    result
}

fn main() {
    // build top_el as you did
    println!("{:?}", iter_els(&vec![top_el]));
}
fn iter_els Vec
fn iter_els<'el>(prev_result: &'el Vec<El>) -> Vec<&'el El> {
    // Iterate over all elements from a tree, starting at the top-level element.
    let mut result : Vec<_> = prev_result.iter().collect();

    for el in prev_result {
        for child in &el.children {
            result.push(child);
        }
        result.extend(iter_els(&el.children));
    }
    result
}

fn main() {
    // build top_el as you did
    println!("{:?}", iter_els(&vec![top_el]));
}