에 대한 솔루션을 구축하기 위해 기본적으로 매개 변수를 통해 초기 값이 수신되는 가변 숫자 변수를 통해 닫히는 클로저를 반환하는 함수가 필요합니다. 이 클로저를 호출 할 때마다이 캡처 된 변수가 클로저의 매개 변수 인 값만큼 증가하고 누적 된 값이 반환됩니다.변경 가능한 환경에서 클로저 반환
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,)));
}
는 AFAIK이 고정 값에 의해
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
입니다 :
나는이에 발전기를 수정합니다.
이 의미론의 차이점은 버그처럼 보입니다. 하지만 그 외에도, 호출간에 환경이 재설정되는 이유는 무엇입니까?
이것은 녹슬지 않은 0.12.0으로 수행되었습니다.
또 다른 접근 방법은 https://github.com/Hoverbear/rust-rosetta/blob/master/src/accumulator_factory.rs에서 확인할 수 있습니다. 녹슬지 않은 새로운 클로저는 구조체와 특성 구현을위한 설탕입니다. 이 버전은 긴 "unsugared"버전을 작성합니다 –