为什么包装 FnMut 的 `std::cell::RefMut<'_, [..]>` 没有实现 DerefMut?

Tor*_*nny 6 closures mutable rust

我想将一个FnMut闭包包装成RefCell如下所示:

fn borrow_mut_closure() {
    let mut temp = 3i32;
    let cl = RefCell::new(move || {
        temp += 1;
        println!("{}", temp);
    });
    cl.borrow_mut()();
}
Run Code Online (Sandbox Code Playgroud)

但令我惊讶的是,编译器报告:

cannot borrow data in a dereference of `std::cell::RefMut<'_, [closure@src/main.rs:17:25: 20:4 temp:i32]>` as mutable

cannot borrow as mutable

help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `std::cell::RefMut<'_, [closure@src/main.rs:17:25: 20:4 temp:i32]>`rustc(E0596)
Run Code Online (Sandbox Code Playgroud)

但为什么不实施呢?我怎样才能克服这个问题?

log*_*yth 4

这看起来像是一个编译器错误。看起来这可能是这里报告的同一问题:尽管 DerefMut ,但无法借用可变的

如果您更改,您的代码将起作用

cl.borrow_mut()();
Run Code Online (Sandbox Code Playgroud)

相反是

(&mut *cl.borrow_mut())();
Run Code Online (Sandbox Code Playgroud)

在调用之前显式取消引用该值作为可变值。