2016-04-01 Update:
从Rust 1.0开始,代码应该如下所示:
fn call_twice<A, F>(val: A, mut f: F) -> A
where F: FnMut(A) -> A {
let tmp = f(val);
f(tmp)
}
fn main() {
fn double(x: i32) -> i32 {x + x};
println!("Res is {}", call_twice(10, double));
println!("Res is {}", call_twice(10, |x| x + x));
}
对closure参数的更改是因为closure are现在已解除绑定.
Original:
据我所知,你不能像那样定义内联函数.
你要做的就是了结.以下工作:
fn call_twice<A>(val: A, f: |A| -> A) -> A {
let tmp = f(val);
f(tmp)
}
fn main() {
fn double(x: int) -> int {x + x};
println!("Res is {}", call_twice(10i, double));
println!("Res is {}", call_twice(10i, |x| x + x));
}
有几件事需要注意:
函数强制闭包,但事实并非如此.
由于borrow 规则的原因,您需要将f(val)
的结果存储在一个临时文件中.简短版本:你需要对闭包的唯一访问才能调用它,而借阅判断器不够聪明,无法意识到这两个调用在其原始位置上是独立的.
闭包正在被unboxed closures个替换,所以这在future 会发生变化,但我们还没有完全做到.