Compiler errors 为什么借用检查器会拒绝内联表达式,但接受其分解形式?

Compiler errors 为什么借用检查器会拒绝内联表达式,但接受其分解形式?,compiler-errors,rust,Compiler Errors,Rust,我天真地希望下面的两个函数try\u drain.*具有相同的行为,但是第一个函数编译失败,而第二个函数执行时没有问题 struct Container { map: RefCell<HashMap<i32, i32>>, } impl Container { fn try_drain_inline(&self) { self.map.borrow_mut().drain(); } fn try_drain_br

我天真地希望下面的两个函数
try\u drain.*
具有相同的行为,但是第一个函数编译失败,而第二个函数执行时没有问题

struct Container {
    map: RefCell<HashMap<i32, i32>>,
}

impl Container {
    fn try_drain_inline(&self) {
        self.map.borrow_mut().drain();
    }

    fn try_drain_broken_down(&self) {
        let mut guard = self.map.borrow_mut();
        guard.drain();
    }
}
则可以尝试将排水管断开

似乎它所创建的临时机构被销毁的顺序存在问题;而“手动”物化临时措施可以纠正这种情况

为什么借阅检查器会拒绝内联表单并接受细分表单?


注意:我的真实代码是一个
try\u pop
函数,它需要两个中间变量:

fn尝试\u pop(&self)->选项{
让mut guard=self.map.borrow_mut();
让mut drain=guard.drain();
drain.next().map(|(|,t)| t)
}

因为内联版本相当于以下代码:

fn try_drain_inline_broken_down(&self) {
    {   // Implicit block around the whole expression
        let mut guard = self.map.borrow_mut();
        guard.drain()    // No semicolon here
    };                   // The semicolon is here
}
这样编写之后,您会注意到,
drain
返回的值需要足够长的时间才能从块中返回,但它保留了对
guard
的引用,该引用仅在块结束之前有效


在分解版本中,
drain
返回的值仅在分号之前有效,而
guard
在块结束之前有效,因此一切正常。

可能相关:;也许这与此有关:
fn try_drain_inline_broken_down(&self) {
    {   // Implicit block around the whole expression
        let mut guard = self.map.borrow_mut();
        guard.drain()    // No semicolon here
    };                   // The semicolon is here
}