Trait core::ops::FnMut 1.0.0[−][src]
#[must_use = "closures are lazy and do nothing unless called"] pub trait FnMut<Args>: FnOnce<Args> { extern "rust-call" fn call_mut(
&mut self,
args: Args
) -> Self::Output; }
Expand description
采用可变接收者的调用运算符的版本。
FnMut
的实例可以重复调用,并且可以改变状态。
FnMut
由闭包自动实现,闭包将可变引用引用到捕获的变量,以及实现 Fn
的所有类型,例如 (safe) function pointers (因为 FnMut
是 Fn
的特征)。
另外,对于任何实现 FnMut
的 F
类型,&mut F
也实现 FnMut
。
由于 FnOnce
是 FnMut
的 super trait,因此可以在期望 FnOnce
的地方使用 FnMut
的任何实例,并且由于 Fn
是 FnMut
的子特性,因此可以在预期 FnMut
的地方使用 Fn
的任何实例。
当您想接受类似函数类型的参数并需要反复调用它,同时允许其改变状态时,请使用 FnMut
作为绑定。
如果您不希望参数改变状态,请使用 Fn
作为绑定; 如果不需要重复调用,请使用 FnOnce
。
有关此主题的更多信息,请参见 Rust 编程语言 中关于闭包的章节。
还要注意的是 Fn
traits 的特殊语法 (例如
Fn(usize, bool) -> usize
)。对此技术细节感兴趣的人可以参考 Rustonomicon 中的相关部分。
Examples
调用可变捕获闭包
let mut x = 5; { let mut square_x = || x *= x; square_x(); } assert_eq!(x, 25);Run
使用 FnMut
参数
fn do_twice<F>(mut func: F) where F: FnMut() { func(); func(); } let mut x: usize = 1; { let add_two_to_x = || x += 2; do_twice(add_two_to_x); } assert_eq!(x, 5);Run