这个例子中有没有办法绕过克隆?

问题描述 投票:0回答:1

我有下面的一段代码,它工作得很好,但我对 for 循环中需要

clone
感到有点困扰。原则上,调用
a.clear()
后不再需要该向量,因此可以在该循环内使用它,但如果没有
clone
,代码将无法编译。有没有一种聪明的方法可以解决这个问题,将
self.a[i].v
移动到新的
AStruct
而不是克隆它?

use std::collections::HashMap;

#[derive(Debug)]
struct AStruct {
    v: Vec<i32>,
    w: i32,
}

struct TestStruct {
    a: Vec<AStruct>,
}

impl TestStruct {
    fn test(&mut self) {
        let mut h: HashMap<Vec<i32>, i32> = HashMap::new();
        for x in &self.a {
            let key = x.v.clone();
            let entry = h.entry(key).or_insert(0);
            *entry += x.w;
        }
        self.a.clear();
        for (key, value) in h {
            self.a.push( AStruct {
                v: key,
                w: value,
            } );
        }
    }
}

fn main() {
    let a = AStruct {
        v: vec![1, 2, 3],
        w: 4,
    };
    let mut t = TestStruct { a: vec![a] };
    t.test();
    println!("{:?}", t.a);
}
rust clone ownership
1个回答
0
投票

感谢评论,我最终找到了解决方案

impl TestStruct {
    fn test(&mut self) {
        let mut h: HashMap<Vec<i32>, i32> = HashMap::new();
        let y: Vec<AStruct> = self.a.drain(..).collect();
        for mut x in y {
            let key = x.v.drain(..).collect();
            let entry = h.entry(key).or_insert(0);
            *entry += x.w;
        }
        for (key, value) in h {
            self.a.push( AStruct {
                v: key,
                w: value,
            } );
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.