我有以下代码片段:
fn f<T: FnOnce() -> u32>(c: T) {
println!("Hello {}", c());
}
fn main() {
let mut x = 32;
let g = move || {
x = 33;
x
};
g(); // Error: cannot borrow as mutable. Doubt 1
f(g); // Instead, this would work. Doubt 2
println!("{}", x); // 32
}
疑问1
我无法运行我的闭包函数。
疑问2
……但只要通过 f
调用它,我就可以随意调用该闭包函数多次。有趣的是,如果我将其声明为 FnMut
,我会得到与疑问1中相同的错误。
疑问3
Fn
、FnMut
和 FnOnce
这些 traits 的定义中,self
是指什么?它是指闭包本身还是指“环境”?
例如,从文档中:
pub trait FnMut<Args>: FnOnce<Args> {
extern "rust-call" fn call_mut(&mut self, args: Args) -> Self::Output;
}
self
变量有关(疑问 3):FnOnce
有self
,但FnMut
有&mut self
。 - fcracker79FnOnce
具有内部可变性”- 不,这不是真的。调用FnOnce
会 消费 闭包,但这与内部可变性无关。 - Sven Marnach