Rust 生锈的盒装函数工厂(高阶函数)导致;调用表达式需要函数";
我想传递一个函数工厂,即一个高阶函数,但我得到Rust 生锈的盒装函数工厂(高阶函数)导致;调用表达式需要函数";,rust,Rust,我想传递一个函数工厂,即一个高阶函数,但我得到调用表达式要求函数错误 // 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: 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)`
}
//接受4个f32的函数生成一个将一个f32映射到另一个f32的函数
//不起作用
类型FunctionFactoryType=Box(dyn Fn(f32)->f32)>;
fn abc(x:功能工厂类型){
(*x)(1.0,2.0,3.0,4.0);
//^调用表达式需要函数
//所需函数,已找到`(dyn-Fn(f32,f32,f32,f32)->(dyn-Fn(f32)->f32+'静态)+'静态)`
}
如果我使用“常规函数”(不是更高阶),即
框f32)>
它可以工作。我是遗漏了什么还是这是一个生锈的错误?如果您直接使用外部dyn-Fn
返回框而不是dyn-Fn
,则您的呼叫会编译:
type FunctionFactoryType = Box<dyn Fn(f32, f32, f32, f32) -> Box<dyn Fn(f32) -> f32>>;
type FunctionFactoryType=Box-Box-f32>;
(请注意,调用框时不需要(*x)(…)
,只需使用x(…)
)
dyn Fn(…)
的返回类型无效,因为dyn Fn
没有大小,您必须将其放在引用或智能指针后面。因为它处于返回位置,所以不能作为参考,所以您需要的是框f32>
。(本节中也介绍了这一点。)
错误消息非常隐晦,可能是由于声明中的缺陷阻止了框
实现Fn(…)
,从而使其成为非函数。有趣的是,如果您将调用全部注释掉,即使FunctionFactoryType
的原始定义不正确,编译也会成功。我认为问题在于函数的返回类型没有大小,例如:
type FunctionFactoryType<O: Fn(f32) -> f32> = Box<dyn Fn(f32, f32, f32, f32) -> O>;
fn abc<O: Fn(f32) -> f32>(x: FunctionFactoryType<O>) {
(*x)(1.0, 2.0, 3.0, 4.0);
}
类型函数FactoryType f32>=框O>;
fn abc f32>(x:功能工厂类型){
(*x)(1.0,2.0,3.0,4.0);
}
它还可以将返回的函数放入框f32>
我无法回答为什么它说这不是一个函数表达式。我现在已经提交了一份关于本案例诊断的报告。