Trait std::ops::FnMut

1.0.0 · source ·
pub trait FnMut<Args>: FnOnce<Args>where
    Args: Tuple,{
    // Required method
    extern "rust-call" fn call_mut(
        &mut self,
        args: Args
    ) -> Self::Output;
}
Expand description

采用可变接收者的调用运算符的版本。

FnMut 的实例可以重复调用,并且可以改变状态。

FnMut 是由闭包自动实现的,闭包采用对捕获变量的可变引用,以及实现 Fn 的所有类型,例如 (safe) 函数指针 (因为 FnMutFn 的 super trait)。 另外,对于任何实现 FnMutF 类型,&mut F 也实现 FnMut

由于 FnOnceFnMut 的 super trait,因此可以在期望 FnOnce 的地方使用 FnMut 的任何实例,并且由于 FnFnMut 的子特性,因此可以在预期 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

Required Methods§

source

extern "rust-call" fn call_mut(&mut self, args: Args) -> Self::Output

🔬This is a nightly-only experimental API. (fn_traits #29625)

执行调用操作。

Implementors§

source§

impl<A, F> FnMut<A> for &Fwhere A: Tuple, F: Fn<A> + ?Sized,

source§

impl<A, F> FnMut<A> for &mut Fwhere A: Tuple, F: FnMut<A> + ?Sized,

1.35.0 · source§

impl<Args, F, A> FnMut<Args> for Box<F, A>where Args: Tuple, F: FnMut<Args> + ?Sized, A: Allocator,