为什么 `std::cell::RefMut<'_, [..]>` 不实现 DerefMut,它包装了 FnMut?

6

我想将一个 FnMut 闭包封装在一个 RefCell 中,如下所示:

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

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

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)

但为什么没有实现呢?我该怎样克服这个问题呢?

1个回答

4

这似乎是一个编译器的错误。看起来可能是同样的问题已经在这里报告了:Cannot borrow as mutable despite DerefMut

如果更改您的代码,它将会工作。

cl.borrow_mut()();

替换为

(&mut *cl.borrow_mut())();

在调用之前明确将值作为可变的解除引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接