如何将可变状态转换为闭包?

Shchvova

闭包状态中有一些数据,但是如何使它可变?例如,我想要一个计数器关闭,每次都返回递增的值,但是它不起作用。我该如何运作?

fn counter() -> Box<Fn() -> i32> {
    let mut c: i32 = 0;
    Box::new(move || {
        c += 1;
        c
    })
}

fn main() {
    let mut a = counter();
    let mut b = counter();
    println!("{:?}", [a(), a(), a(), b(), b(), a()]);
}

错误(和警告),我得到:

error: cannot assign to captured outer variable in an `Fn` closure
        c += 1;
        ^~~~~~
help: consider changing this closure to take self by mutable reference
    Box::new(move || {
        c += 1;
        c
    })

我希望它输出类似的内容[1, 2, 3, 1, 2, 4]

谢泼玛特

如错误消息所述:

无法在Fn闭包中分配给捕获的外部变量

相反,您需要一个FnMut闭包:

fn counter() -> Box<FnMut() -> i32> {
    let mut c = 0;
    Box::new(move || {
        c += 1;
        c
    })
}

fn main() {
    let mut a = counter();
    let mut b = counter();

    let result = [a(), a(), a(), b(), b(), a()];
    println!("{:?}", result);

    assert_eq!([1, 2, 3, 1, 2, 4], result);
}

正如FnMut文档所说:

带有可变接收方的呼叫操作员版本。

这允许闭包使包含的状态发生突变。

顺便说一句,c不需要for的显式类型


使我感到困惑的是pub trait Fn<Args>: FnMut<Args>这不是意味着Fn(我用过的)应该支持的行为FnMut吗?

也许闭包何时实现Fn,FnMut和FnOnce?可以帮助提供一些背景信息。这是我凭直觉获得的一个方面,但是还没有弄清楚如何最好地进行交流。查找Rust中的闭包的这一部分似乎也很相关:

从高层次self上讲,实现者(即用户为实现特征而定义的类型)具有最大的灵活性,而&mut self下一个则灵活性&self最小。相反,&self使特性(即具有受特性限制的泛型的函数)的使用者具有最大的灵活性,而self最小的灵活性

简而言之,该特征定义表明任何FnMut闭包都可以用作Fn闭包这很有意义,因为我们可以简单地忽略可变性。您不能采用其他方式-您不能将可变引用作为可变引用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将可变集合变成不可变集合

如何将Rust闭包转换为C样式的回调?

将库转换为JavaScript闭包

如何快速使用可变参数闭包?

如何将可观察值转换为可能值?

如何将可变列表传递给捆绑包?

如何将可变格式的字符串数据转换为日期时间?

如何将可变长度的字符串转换为矢量?

如何将可变参数模板转换为多个单个模板?(C ++竞争编程调试模板)

如何将可滚动小部件转换为图像?

如何将JDBC结果转换为不可变的集合

如何将可变向量放入状态Monad

如何将可选的NSInteger转换为非可选的NSInteger?

如何将闭包转换为R中的字符?

MySQL将可变列转换为行

在Scala中将可变集合转换为不可变集合

如何将可空的DateTime强制转换为UTC DateTime

如何将Objective-C块转换为Swift闭包?

如何将可选的NSData转换为可选的Bool

如何将可变参数模板参数转换为另一种类型以调用另一个函数?

在 Swift 中将可变结构转换为不可变结构

(VBA)具有数千行的 Excel - 如何将可变长度的列转换为行?

如何将闭包转换为承诺

如何将可空变量转换为不可空类型?

如何在 Swift 中将计算的闭包属性转换为闭包?

如何将可变长度列表的列表转换为 CSV 文件?

如何将可变长度列表从一个 python 数据框列转换为行?

当我们永远不能同时拥有可变引用时,我们如何将可变引用强制转换为不可变引用?

如何将可变参数函数参数转换为数组?