当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust FnMut用法及代码示例


本文简要介绍rust语言中 Trait std::ops::FnMut 的用法。

用法

pub trait FnMut<Args>: FnOnce<Args> {
    extern "rust-call" fn call_mut(        &mut self,         args: Args    ) -> Self::Output;
}

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

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

FnMut 由闭包自动实现,闭包对捕获的变量进行可变引用,以及实现 Fn 的所有类型,例如(安全)function pointers (因为 FnMut Fn 的超级特征)。此外,对于实现 FnMut 的任何类型 F&mut F 也实现 FnMut

由于 FnOnce FnMut 的超特征,因此 FnMut 的任何实例都可以在预期 FnOnce 的地方使用,并且由于 Fn FnMut 的子特征,因此 Fn 的任何实例都可以在需要FnMut 的地方使用。

当你想接受一个function-like类型的参数并且需要重复调用它,同时允许它改变状态时,使用FnMut作为绑定。如果您不希望参数改变状态,请使用 Fn 作为界限;如果您不需要重复调用它,请使用 FnOnce

关于关闭的章节Rust 编程语言有关此主题的更多信息。

另外值得注意的是特殊语法Fn特征(例如Fn(usize, bool) -> usize)。对技术细节感兴趣的可以参考中的相关部分鲁斯托之书.

例子

调用可变捕获闭包

let mut x = 5;
{
    let mut square_x = || x *= x;
    square_x();
}
assert_eq!(x, 25);

使用 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);

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Trait std::ops::FnMut。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。