我正在尝试构建一个解决方案Graham´s accumulator factory challenge,它基本上需要一个函数返回一个闭包,该闭包闭合一个可变数值变量,其初始值通过参数接收。每次调用此闭包时,都会将捕获的变量增加一个作为闭包参数的值,并返回累积值。
阅读了closures RFC和一些关于返回未装箱闭包的问题(特别是this)后,我终于想出了一个编译的解决方案,但结果并不是我所期望的。
据我所知,此闭包通过值捕获了
但是,打印的结果在两种情况下都是
如果我将生成器修改为以下内容:
阅读了closures RFC和一些关于返回未装箱闭包的问题(特别是this)后,我终于想出了一个编译的解决方案,但结果并不是我所期望的。
#![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,)));
}
据我所知,此闭包通过值捕获了
acc
,生成的结构充当环境是可变的,acc_cl
应该在调用之间保留相同的环境实例。但是,打印的结果在两种情况下都是
6
,因此修改后的值似乎没有持续。更令人困惑的是如何计算此结果。每次执行闭包时,acc
的初始值都为3
,即使在调用时n
为5
。如果我将生成器修改为以下内容:
fn accumulator_factory(n: f64) -> Box<|&mut: f64| -> f64> {
println!("n {}", n);
let mut acc = n;
box |&mut: i: f64| {
acc += i;
acc
}
}
然后执行总是返回3
,并且在闭包进入时acc
的初始值始终为0
。
这种语义上的差异看起来像是一个bug。除此之外,为什么会在调用之间重置环境呢?
这是使用rustc 0.12.0运行的。