考虑这个伪伪代码。keyarg
我对下面的论点有很多困难,
type MapSet<K,V> = HashMap<K,HashSet<V>>;
fn contract<K,V,V1>(left: &MapSet<K,V>, right: &MapSet<V,V1>,
out: &mut MapSet<K,V1>,
keyarg: Option(__something_iterable__) {
let keys = match keyarg {
Some(keys) => {
keys
},
None => {
left.keys()
},
}
for &k in keys {
// ... do stuff ...
}
}
该功能有时会这样使用,
let x: MapSet<u32,String>;
let y: MapSet<String,u32>;
let out: MapSet<u32,u32>;
let kk: HashSet<u32>;
// ... snip ...
contract(x,y,out,kk);
而且,在其他类似的时候,
let x: MapSet<u32,String>;
let y: MapSet<String,u32>;
let out: MapSet<u32,u32>;
contract(x,y,out,None);
换句话说,我有时使用keyarg
参数来传递Option
带有对包含我想要迭代的键的 a 的引用,HashSet
而在其他时候我想迭代包含在left
参数中的所有键,所以keyarg
变成了简单的None
.
但是,到目前为止,我总是遇到一个问题,match
它抱怨 None 导致Keys
对象和 Some branch 到 HashSet (类型不匹配错误)。
我的问题是如何定义keyarg
论点,以便分支match
彼此兼容。也就是说,我想表达一个事实,即变量keys
只是一个可以迭代到编译器的东西。