代码之家  ›  专栏  ›  技术社区  ›  Guy Korland

双可变借用Rust'if let'语句

  •  0
  • Guy Korland  · 技术社区  · 4 年前

    为什么下面的代码与Rust合并会产生双重可变借用错误? 我希望第一个作用域是第一个块,因为返回的值不能超过这个块,而 else if 如果第一个 if 返回 Some(arr) .

    if let Some(arr) = v.as_array_mut(){
     ...
    } else if let Some(obj) = v.as_object_mut(){
     ...
    } else {
     ...
    }
    
        |
    178 |                 if let Some(arr) = v.as_array_mut(){
        |                                    -------------------------- first mutable borrow occurs here
    ...
    195 |                 } else if let Some(obj) = v.as_object_mut(){
        |                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
        |                                           |
        |                                           second mutable borrow occurs here
        |                                           first borrow later used here
    

    顺便说一句,将每个通话中断为两个通话,这提供了一个完全相似的行为,显然不会喊出错误:

    if v.is_array(){                    
        let arr = v.as_array_mut().unwrap();
        ...
    } else if v.is_object(){
        let obj = v.as_object_mut().unwrap();
        ...
    } else {
        ...
    }
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   peterulb    4 年前

    这与 non-lexical lifetimes .

    扩展Rust的借阅系统以支持非词法生命周期——这些生命周期基于控制流图,而不是词法范围。RFC详细描述了如何推断这些新的、更灵活的区域,并描述了如何调整错误消息。RFC还描述了对借阅检查程序的其他一些扩展,其总体效果是消除了许多常见情况,在这些情况下,为了通过借阅检查,需要对本地代码进行小的功能修改。(附录描述了本RFC未解决的一些剩余借阅检查限制。)

    1.36已为2015版启用NLL。2018版默认情况下会启用它们。

    所以在你的情况下,我猜你的版本不支持NLL。