有人可以解释一下,根据匹配人体工程学规则(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
})
Run Code Online (Sandbox Code Playgroud)
据我了解,这两种模式都使用非引用模式匹配引用(对元组),因此将默认绑定模式更改为ref. 但令我困惑的是 类型key2最终是 asi32和 not &i32。
根据 RFC 2005,这里尝试编写上述两种模式的脱糖模式:
let &(ref key1_desugared, _) = entry; // typeof(key1_desugared) -> &&i32
let &(& ref key2_desugared, _) = entry; // typeof(key2_desugared) -> &i32
Run Code Online (Sandbox Code Playgroud)
尽管 的类型key1_desuraged最终与 的类型匹配key1,但 的类型key2_desugared是&i32。
key2以脱糖形式表达模式的正确方法是什么?
这里需要注意的是,匹配人体工程学仅更改非参考图案的绑定模式,而不更改参考图案的绑定模式。这相当于问题匹配人体工程学和&模式中讨论的第二种情况。应用该问题答案中的解释:
(key1, _)是与引用匹配的非引用模式,因此entry取消引用到(&i32, _). 由于key1是非引用模式,因此它现在与ref模式绑定(因为外部绑定已取消引用)。原来entry.0的 an &i32,现在变成对 a或 a 的key1引用。&i32&&i32(&key2, _)是非引用模式,因此entry取消对 a 的引用(&i32, _)。&key2然后与&i32参考进行匹配。由于&key2是参考图案,因此匹配人体工程学并不适用。key2因此是一个i32.