这个功能是否可以在Rust中创建?

3
fn foo(f: fn(u32) -> u32) -> fn(u32, u32) -> u32 {
    unimplemented!()
}

一个以函数指针作为参数的函数,返回一个调用原始函数且忽略额外参数的函数指针。

以下是类似于该概念的内容,但请忽略它不能编译的事实:

fn foo(f: fn(u32) -> u32) -> fn(u32, u32) -> u32 {
    |x, _| f(x)
}

2
无论你返回什么,都必须调用 f,因此它必须记住要调用的 f。函数不能记住任何东西,只有闭包可以。 - n. m.
1个回答

4
很不幸,这是不可能的。函数没有状态,所以每次调用 foo 时,都必须生成一个全新的函数,该函数内部调用 f,显然这是不可能的。 如果您愿意放宽返回类型,可以返回一个 impl Fn(u32, u32) -> u32
fn foo(f: fn(u32) -> u32) -> impl Fn(u32, u32) -> u32 {
    move |x, _| f(x)
}

fn main() {
    let new_f = foo(|x| x);
    assert_eq!(new_f(1, 2), 1);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接