[英]How to generalize a function over two types with similar fields in different positions?
[英]How to generalize a HashMap passed to a function with different types of keys?
我有一个hm1: HashMap<K, V>
,其中K
是一个元组(k1, 2, k3)
而V
是一个包含 10 个元素的元组,例如(v1, v2, v3, /* ... */ v10)
。
我有一个作用于该HashMap
的函数,所以我将它作为参数传递:
fn do_something(hm1: HashMap<(&i64, &i64, &Option<i64>), (&i64, &i64, /* ... */ &i64)>) -> () {
//Access k1, k2, k3 and v1 .. v10 and do something with it
}
我有第二个HashMap
hm2
,其中唯一的区别是一个额外的关键元素。 hm2: HashMap<K, V>
其中K
是一个元组(k1, k2, k3, k4)
而V
又是一个包含 10 个元素的元组(v1, v2, v3, /* ... */ v10)
。
我想避免将相同的do_something()
函数复制粘贴到经过修改的签名中,因为内部的逻辑几乎相同。 不同之处只是我在元组中有一个额外的k4
元素,如果我有hm2
,我也可以访问它。
有没有办法概括HashMap<K, V>
参数,以便我可以传递两个HashMap
并对其进行操作而无需复制我的函数?
我想避免将相同的
do_something()
函数复制粘贴到经过修改的签名中,因为内部的逻辑几乎相同。
为不同类型复制几乎相同的代码是 Rust 泛型的设计目标! 如果两种情况下值的类型相同,并且只有键不同,则可以对键进行抽象:
type Value<'a> = (&'a i64, &'a i64, /* ... */ &'a i64);
fn do_something<K>(hash_map: HashMap<K, Value<'_>>) {
for value in hash_map.values() {
// do something with the value
}
}
鉴于您对函数内部的键一无所知,因此您无法对它们做太多事情。 特别是,您不能解构它们以访问关键元组的各个元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.