给定以下 rust 程序:
fn call_twice<A>(val: A, f: fn(A) -> A) -> A {
f(f(val))
}
fn main() {
fn double(x: int) -> int {x + x};
println!("Res is {}", call_twice(10i, double));
// println!("Res is {}", call_twice(10i, (x: int) -> int {x + x}));
// ^ this line will fail
}
为什么我可以将 double
作为函数传递,而不是内联?在不在某处定义函数的情况下实现相同行为的好方法是什么?
最佳答案
2016-04-01更新:
从 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));
}
对闭包参数的更改是因为闭包现在已拆箱。
原文:
据我所知,您不能像那样定义内联函数。
您想要的是闭包。以下作品:
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));
}
有几点需要注意:
函数强制关闭,但反之则不然。
由于借用规则,您需要临时存储
f(val)
的结果。简短版本:您需要对闭包的唯一访问权限才能调用它,而借用检查器还不够聪明,无法意识到这两个调用在其原始位置是独立的。闭包正在被未装箱的闭包取代,所以这在未来会改变,但我们还没有完全做到这一点。
关于function - 如何在 Rust 中将函数作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27080405/