小编Jua*_*dal的帖子

返回具有可变环境的闭包

我正在尝试为Graham的累加器工厂挑战构建一个解决方案,该解决方案基本上需要一个函数来返回一个闭包,该闭包关闭一个可变数值变量,该变量通过参数接收初始值.每次调用此闭包都会将此捕获的变量增加一个值,该值是闭包的参数并返回累计值.

阅读闭包RFC和一些关于返回未装箱的闭包的问题(特别是这个).我终于可以提出一个编译的解决方案,但结果并不是我所期望的.

#![feature(unboxed_closures, unboxed_closure_sugar)]

fn accumulator_factory(n: f64) -> Box<|&mut: f64| -> f64> {
    let mut acc = n;
    box |&mut: i: f64| {
        acc += i; 
        acc
    }
}

fn main() {
    let mut acc_cl = accumulator_factory(5f64);
    println!("{}", acc_cl.call_mut((3f64,)));
    println!("{}", acc_cl.call_mut((3f64,)));
}
Run Code Online (Sandbox Code Playgroud)

AFAIK这个闭包acc按值捕获,生成的结构充当环境是可变的,并且acc_cl应该在调用之间保留相同的环境实例.

但打印结果6在两种情况下都是如此,因此修改后的值似乎不会持续存在.更令人困惑的是如何计算这个结果.在每次执行闭包时,初始值即使是在调用时acc也是3如此.n5

如果我将生成器修改为:

fn accumulator_factory(n: f64) -> Box<|&mut: f64| -> f64> {
    println!("n {}", n);
    let mut acc = n; …
Run Code Online (Sandbox Code Playgroud)

closures rust

6
推荐指数
1
解决办法
513
查看次数

标签 统计

closures ×1

rust ×1