Rust 如何修复Clippy::或_fun _callfor或_insert/或_insert _with的Clippy警告?
我需要计算Vec中自定义结构的重复项。我找到了 我的代码是: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
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)这仍然是更好的练习。但是,它可能已经被修复了。