Rust 中的盒装函数工厂(高阶函数)导致“调用表达式需要函数”

phi*_*611 2 rust

我想传递一个函数工厂,即一个高阶函数,但我收到call expression requires function错误。

// function that takes 4 f32 generates a function which maps one f32 to another f32
// DOESN'T WORK
type FunctionFactoryType = Box<dyn Fn(f32, f32, f32, f32) -> (dyn Fn(f32) -> f32)>;

fn abc(x: FunctionFactoryType) {
    (*x)(1.0, 2.0, 3.0, 4.0);
    // ^ call expression requires function
    // expected function, found `(dyn Fn(f32, f32, f32, f32) -> (dyn Fn(f32) -> f32 + 'static) + 'static)`
}
Run Code Online (Sandbox Code Playgroud)

如果我使用“常规函数”(不是高阶函数),即Box<dyn Fn(f32 -> f32)>它有效。我错过了什么还是这是一个 Rust 错误?

use*_*342 6

如果您进行外部dyn Fn返回Box<dyn Fn>而不是dyn Fn直接返回,则您的调用会编译:

type FunctionFactoryType = Box<dyn Fn(f32, f32, f32, f32) -> Box<dyn Fn(f32) -> f32>>;
Run Code Online (Sandbox Code Playgroud)

(请注意,您不需要(*x)(...)调用 a Box<Fn...>,您可以使用x(...)。)

的返回类型dyn Fn(...)无效,因为dyn Fn未确定大小,您必须将其放在引用或智能指针后面。由于它在返回位置,它不能作为参考,所以Box<dyn Fn(f32) -> f32>是你想要的。(这在书中也有介绍。)

错误消息非常神秘,大概是由于声明中的缺陷阻止Box了 implementation Fn(...),这使其无法正常工作。有趣的是,如果您完全注释掉调用,即使FunctionFactoryType.