Rust 如何修复Clippy::或_fun _callfor或_insert/或_insert _with的Clippy警告?

Rust 如何修复Clippy::或_fun _callfor或_insert/或_insert _with的Clippy警告?,rust,clippy,Rust,Clippy,我需要计算Vec中自定义结构的重复项。我找到了 我的代码是: pub fn check_index_duplicates( dataset: &[main_index::MotiveImageDefinition], ) -> Result<(), Box<dyn std::error::Error>> { let mut keyed = HashMap::new(); for c in dataset { keyed

我需要计算Vec中自定义结构的重复项。我找到了

我的代码是:

pub fn check_index_duplicates(
    dataset: &[main_index::MotiveImageDefinition],
) -> Result<(), Box<dyn std::error::Error>> {
    let mut keyed = HashMap::new();
    for c in dataset {
        keyed.entry(c.key()).or_insert(vec![]).push(c)
    }

    for (k, v) in &keyed {
        if v.len() > 1 {
            print_an_error(&(format!("Motive {:?} has {} duplicates on index.csv", k, v.len())));
        }
    }
    Ok(())
}

impl main_index::MotiveImageDefinition {
    fn key<'a>(&'a self) -> (&'a str, &'a str) {
        (&self.motive, &self.theme)
    }
}

#[derive(Debug)]
pub struct MotiveImageDefinition {
    pub id: u64,
    pub motive: String,
    pub theme: String,
    pub path: String,
    pub stereo_image: String,
    pub width_pix: String,
    pub height_pix: String,
}
它给了我下面两个我无法修复的提示:

错误:使用`or_insert`后跟函数调用
-->src/image/mod.rs:215:30
|
215 |键控输入(c.key())或_插入(vec![])。推送(c)
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^`

我试图将
或_insert
更改为
或_insert_with
,但它没有编译。

它对我实际起作用的是@user4815162342答案:

pub fn check_index_duplicates(
    dataset: &[main_index::MotiveImageDefinition],
) -> Result<(), Box<dyn std::error::Error>> {
    let mut keyed = HashMap::new();
    for c in dataset {
        keyed.entry(c.key()).or_insert_with(Vec::new).push(c)
    }

    for (k, v) in &keyed {
        if v.len() > 1 {
            print_an_error(&(format!("Motive {:?} has {} duplicates on index.csv", k, v.len())));
        }
    }
    Ok(())
}
pub fn检查索引副本(
数据集:&[main_index::MotiveImageDefinition],
)->结果{
让mut keyed=HashMap::new();
对于数据集中的c{
keyed.entry(c.key())或插入(Vec::new).push(c)
}
对于(k,v)输入和键控{
如果v.len()大于1{
打印错误(&(格式!({:?}在index.csv上有{}个重复项,k,v.len());
}
}
好(())
}

试试
或_insert_with(Vec::new)
或_insert_with(| | Vec![])
,无论你觉得哪个更好。顺便说一句,我认为clippy在这里过于热心了-因为空的
Vec
不会分配,所以创建一个“不必要的”Vec对编译器来说是透明的。我强烈怀疑这两个变量之间的差异是无法衡量的。很难回答你的问题,因为它不包括一个变量。我们无法说出代码中存在哪些板条箱(及其版本)、类型、特征、字段等。如果您试图重现您的错误(如果可能的话),或者在全新的货运项目中,那么我们将更容易帮助您,然后您的问题将包括附加信息。您可以使用以下方法减少在此处发布的原始代码。谢谢看起来你的问题可能会由你的答案来回答。如果没有,请回答您的问题以解释差异。否则,我们可以将此问题标记为已回答。@user4815162342我想(1)Clippy不知道(或可能不想知道)Vec::new做了什么(2)这仍然是更好的练习。但是,它可能已经被修复了。