请问根据人机工程学匹配( RFC 2005 )规则,有人能否解释一下为什么在引用模式中使用单个&
会导致匹配值多次取消引用?
示例
假设我们有一个 map: HashMap<i32, bool>
。考虑表达式 map.iter().filter(|entry| ...)
,其中entry
的类型是&(&i32, &bool)
。现在,如果我们按以下两种方式对entry
进行模式匹配,会发生什么?
map
.iter()
.filter(|entry| {
let (key1, _) = entry; // typeof(key1) -> &&i32
let (&key2, _) = entry; // typeof(key2) -> i32
})
据我理解,这两种模式都使用非引用模式匹配引用(元组),因此将默认绑定模式更改为
ref
。但让我困惑的是,key2
的类型最终变成了i32
而不是&i32
。根据RFC 2005,以下是对上述两个模式进行解糖的尝试:
let &(ref key1_desugared, _) = entry; // typeof(key1_desugared) -> &&i32
let &(& ref key2_desugared, _) = entry; // typeof(key2_desugared) -> &i32
虽然key1_desuraged
的类型最终与key1
的类型匹配,但key2_desugared
的类型是&i32
。
如何以展开形式表达模式key2
的正确方式?