如何解决or_insert / or_insert_with的clippy :: or_fun_call的Clippy警告?

问题描述

我需要计算Vec中自定义结构的重复项。我找到了count partial duplicates in Vec of structs with a custom function

我的代码是:

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,}

这正是我所需要的。当我使用clippy时:

cargo clippy --all-targets --all-features -- -D warnings

它为我提供了以下两个无法修复的提示

error: use of `or_insert` followed by a function call
   --> src/image/mod.rs:215:30
    |
215 |         keyed.entry(c.key()).or_insert(vec![]).push(c)
    |                              ^^^^^^^^^^^^^^^^^ help: try this: `or_insert_with(vec![])`

我尝试将or_insert更改为or_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(())
}