假设我有两个HashMaps(或任何具有将键映射到其他内容的映射结构),map1和map2,并且我想确保它们具有相同的键集。请注意,键在地图中是相同类型的,但值不相同。
我的初始尝试只是:
注意Rust初学者:我的第一次尝试实际上是在知道映射中的键是String类型的情况下进行的,因此我的函数签名为:
我的初始尝试只是:
map1.keys().eq(map2.keys())
虽然第一次尝试这个方法成功了,但是迭代器的eq函数(可以理解为相等判断)似乎比较的是迭代器产生的键值的顺序,而不是检查第二个迭代器中是否存在一个键。这很容易让人误解。另外,HashMap::keys() 产生的迭代器中 键的顺序不是确定的,这使得即使键集合在集合论意义上相同,相等性函数也经常会失败。
因此,我的下一步尝试是创建一个函数来处理这个问题:
fn keys_match<T:std::cmp::Eq + std::hash::Hash,U,V>(map1:&HashMap<T,U>, map2:&HashMap<T,V>) -> bool {
// Make sure that map1.keys() ⊆ map2.keys()
for key in map1.keys() {
match map2.get(key) {
None => return false,
Some(_) => {}
}
}
// If map1.keys() ⊆ map2.keys() and their sizes equal, then the sets are equal
map1.len() == map2.len()
}
注意Rust初学者:我的第一次尝试实际上是在知道映射中的键是String类型的情况下进行的,因此我的函数签名为:
fn keys_match<T,U>(map1:&HashMap<String,T>, map2:&HashMap<String,U>) -> bool
我意识到可以通过要求它们具有Eq和Hash trait来泛型化通用键类型。
问题:在Rust中有更简洁的方法吗?