0

我正在尝试实现如下所示的算法。我不知道如何使局部变量足够长。可能是我的设计完全错误。

trait Metric {
    fn on_add(&mut self, _i: i32);
}
trait Update {
    fn update(&mut self, _i: i32);
}

struct Metric1 {}
impl Metric for Metric1 {
    fn on_add(&mut self, _i: i32) {
        unimplemented!()
    }
}
impl Update for Metric1 {
    fn update(&mut self, _i: i32) {
        unimplemented!()
    }
}

struct Metric2 {}
impl Metric for Metric2 {
    fn on_add(&mut self, _i: i32) {
        unimplemented!()
    }
}
impl Update for Metric2 {
    fn update(&mut self, _i: i32) {
        unimplemented!()
    }
}

struct collector<'a> {
    metrics: Vec<&'a mut dyn Metric>,
}

fn main() {
    let mut vector_metrics: Vec<Box<dyn Metric>> = Vec::new();
    let mut vector_update: Vec<Box<dyn Update>> = Vec::new();
    for i in 0..2 {
        if i ==0{
        vector_metrics.push(Box::new(Metric1 {}));
        vector_update.push(Box::new(Metric1 {}));

        }
        else{
        vector_metrics.push(Box::new(Metric2 {}));
        vector_update.push(Box::new(Metric2 {}));
        }
    }
    let col_vector : Vec<& mut dyn Metric> = Vec::new();
    for met in vector_metrics{
        col_vector.push(&mut *met)
    }
    let coll = collector{metrics:col_vector};
}

锈操场

4

1 回答 1

1

vector_metrics拥有Metric它持有的对象。您正在尝试创建一个引用这些对象的新向量。

for met in vector_metrics将每个指标移出vector_metrics和移入met循环变量。保留引用意味着没有所有者,并且在每次循环迭代结束时都会删除该指标。要保持指标拥有,您需要将拥有的值存储在col_vector

    let mut col_vector : Vec<Box<dyn Metric>> = Vec::new();
    for met in vector_metrics{
        col_vector.push(met);
    }

vector_metrics或者,您可以通过对每个元素进行可变引用来非破坏性地迭代。这使指标的所有权保留在vector_metrics

    let mut col_vector : Vec<& mut dyn Metric> = Vec::new();
    for met in &mut vector_metrics{
        col_vector.push(&mut **met);
    }
于 2022-02-28T06:59:20.433 回答