function - 如何在 Rust 中将函数作为参数传递

标签 function parameter-passing rust

给定以下 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));
}

有几点需要注意:

  1. 函数强制关闭,但反之则不然。

  2. 由于借用规则,您需要临时存储f(val) 的结果。简短版本:您需要对闭包的唯一访问权限才能调用它,而借用检查器还不够聪明,无法意识到这两个调用在其原始位置是独立的。

  3. 闭包正在被未装箱的闭包取代,所以这在未来会改变,但我们还没有完全做到这一点。

关于function - 如何在 Rust 中将函数作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27080405/

相关文章:

python - 为什么在名称前面有双下划线时传递关键字/命名参数会产生错误?

coldfusion - 处理可选参数 : CFArgument versus isDefined

cygwin - 在 cygwin 上使用 `find` 执行 `std::process::Command` 不起作用

c++ - 包含多个变量的字符串或函数 (c++)

python - 如何在循环中重置 Python 中的一些函数变量

React : why isn't my function returning multiple divs? 中的 Javascript 函数

rust - 将本地字符串作为切片返回 (&str)

c - 将数据类型分配给用户定义的函数

c++ - 什么时候通过复制/引用?

rust - `&str` 类型没有实现特征 [E0277]