我想传递一个函数工厂,即一个高阶函数,但我收到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 错误?
如果您进行外部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
.