参考模式如何出现两次取消引用?

mxx*_*xxk 7 rust

有人可以解释一下,根据匹配人体工程学规则(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以脱糖形式表达模式的正确方法是什么?

操场

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=1cb8170b1221fb1dd221db885f8eed8d

Evi*_*Tak 2

这里需要注意的是,匹配人体工程学仅更改非参考图案的绑定模式,而不更改参考图案的绑定模式。这相当于问题匹配人体工程学和&模式中讨论的第二种情况。应用该问题答案中的解释:

  • (key1, _)是与引用匹配的非引用模式,因此entry取消引用到(&i32, _). 由于key1是非引用模式,因此它现在与ref模式绑定(因为外部绑定已取消引用)。原来entry.0的 an &i32,现在变成对 a或 a 的key1引用。&i32&&i32
  • (&key2, _)是非引用模式,因此entry取消对 a 的引用(&i32, _)&key2然后与&i32参考进行匹配。由于&key2是参考图案,因此匹配人体工程学并不适用key2因此是一个i32.