gpt4 book ai didi

rust - Rust 中的盒装函数工厂(高阶函数)导致 "call expression requires function"

转载 作者:行者123 更新时间:2023-12-03 11:42:05 33 4
gpt4 key购买 nike

我想传递一个函数工厂,即一个高阶函数,但我得到 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)`
}

如果我使用“常规函数”(不是高阶函数),即 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>>;

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

dyn Fn(...) 的返回类型无效,因为 dyn Fn未调整大小,您必须将其放在引用或智能指针后面。由于它处于返回位置,因此不能作为引用,所以 Box<dyn Fn(f32) -> f32>是你想要的。 (这也包含在 the book 中。)

错误消息非常隐晦,可能是由于声明中的缺陷阻止了 Box从实现Fn(...) ,这使它成为一个非函数。有趣的是,如果您完全注释掉该调用,即使 FunctionFactoryType 的原始定义不正确,编译也会成功。 .

关于rust - Rust 中的盒装函数工厂(高阶函数)导致 "call expression requires function",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66646847/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com