【发布时间】:2019-11-06 16:45:26
【问题描述】:
我有以下sn-p的代码:
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
self 在Fn、FnMut 和FnOnce 特征定义中指的是什么?那是闭包本身吗?还是环境?
例如。来自文档:
pub trait FnMut<Args>: FnOnce<Args> {
extern "rust-call" fn call_mut(&mut self, args: Args) -> Self::Output;
}
【问题讨论】:
-
你读过编译器信息吗?
-
虽然消息说让 g 可变并且确实允许代码编译,但为什么不可变的 g 可以在 f 内部使用而不能在外部使用?
-
因为
FnOnce具有内部可变性。 -
@Stargateur "
FnOnce具有内部可变性" – 不,这不是真的。调用FnOnce消耗闭包,但这与内部可变性无关。 -
@Stargateur “内部可变性”是行话。它具有特定的、明确的含义。当然,您可以随意使用该术语来表示其他含义,但我认为这对学习 Rust 的人没有帮助。
标签: rust closures move mutable borrowing