Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 生锈的盒装函数工厂(高阶函数)导致;调用表达式需要函数";_Rust - Fatal编程技术网

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>

我无法回答为什么它说这不是一个函数表达式。

我现在已经提交了一份关于本案例诊断的报告。