gpt4 book ai didi

dictionary - 如何编写一个函数来处理通用映射及其条目类型?

转载 作者:行者123 更新时间:2023-11-29 08:32:38 24 4
gpt4 key购买 nike

我需要一个函数来保护我的 HashMap 不覆盖已经存在的值,所以我写了一个像这样的简单函数:

fn insert_or_panic<K, V>(m: &mut HashMap<K, V>, k: K, v: V)
where
K: Hash + Eq,
{
use std::collections::hash_map::Entry;
match m.entry(k) {
Entry::Vacant(o) => o.insert(v),
Entry::Occupied(_) => panic!("attempt to overwrite entry in dictionary"),
};
}

现在我想将其概括为适用于任何类型的 map :

fn generic_insert_or_panic<M, K, V>(m: &mut M, k: K, v: V)
where
K: Hash + Eq,
M: Map<K, V>,
{
use std::collections::hash_map::Entry;
match m.entry(k) {
Entry::Vacant(o) => o.insert(v),
Entry::Occupied(_) => panic!("attempt to overwrite entry in dictionary"),
};
}

我感兴趣的 HashMap 的所有方法都在它的 impl block 中,不与任何特征关联,所以看起来我必须实现一个新特征:

trait Map<K: Hash + Eq, V> {
fn entry(&mut self, key: K) -> Entry<K, V>;
}

每个映射都有它自己的 Entry 类型:std::collections::hash_map::Entrystd::collections::btree_map::Entry 并且我没有看到替换 Entry 的合适特征。是时候培养另一个特征了吗?

我觉得我走错了方向。如何解决这个问题?


我刚开始学习 Rust,我的一些问题可能看起来不切实际且牵强附会,但我正在寻找解决问题的方法,而不是解决问题,或者至少了解语言的局限性。


常见问题explains higher-kinded types 可以解决这个问题,但这是一个很大的特性,所以 rust 想要小心处理它。

最佳答案

Is it time for another trait?

是的。没有人需要这种特定的通用表达式,因此您可以自己对它们进行抽象。

trait InsertOrPanic<K, V> {
fn generic_insert_or_panic(&mut self, k: K, v: V);
}

use std::collections::HashMap;
use std::hash::Hash;

impl<K, V> InsertOrPanic<K, V> for HashMap<K, V>
where
K: Eq + Hash,
{
fn generic_insert_or_panic(&mut self, k: K, v: V) {
use std::collections::hash_map::Entry;

match self.entry(k) {
Entry::Vacant(o) => o.insert(v),
Entry::Occupied(_) => panic!("attempt to overwrite entry in dictionary"),
};
}
}

use std::collections::BTreeMap;

impl<K, V> InsertOrPanic<K, V> for BTreeMap<K, V>
where
K: Ord,
{
fn generic_insert_or_panic(&mut self, k: K, v: V) {
use std::collections::btree_map::Entry;

match self.entry(k) {
Entry::Vacant(o) => o.insert(v),
Entry::Occupied(_) => panic!("attempt to overwrite entry in dictionary"),
};
}
}

请注意,每个实现的界限是不同的(Hash + EqOrd),因此它们在根本上是不同的。

I feel that I'm going wrong direction. How to solve this problem?

I just started to learn Rust and some of my problems may look unrealistic and far-fetched, but I'm looking for ways to solve problems

您没有提供足够的信息来证明您的需求,所以我要质疑这一说法。通常,您不需要对两种类型的 map 通用,因为问题领域自然会倾向于其中一种。

关于dictionary - 如何编写一个函数来处理通用映射及其条目类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50750309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com