当我传递函数的结构时,预期的 fn 指针,找到闭包

问题描述 投票:0回答:1

我创建了一个 impl,以便能够管理一些异步函数,这些函数必须在我的应用程序打开后立即执行。

我的问题是,当我将结构体作为参数传递时,编译器给出以下错误:

note: expected fn pointer `fn() -> Pin<Box<(dyn Future<Output = ()> + Send + 'static)>>`
                 found closure `{closure@src/main.rs:50:52: 50:54}`
note: closures can only be coerced to `fn` types if they do not capture any variables

我已经找了整整两天没找到解决办法,我在playground上做了一个例子,方便执行。

游乐场链接

我已经在 StackOverflow 和其他论坛上寻找了一些答案,我测试的所有答案都不起作用

multithreading pointers rust closures
1个回答
0
投票

如编译器诊断错误消息中所述,您的

Service::new
采用函数指针作为参数(即
fn ()
)。

您正在传递一个闭包

闭包不是函数指针。闭包可能衰变(隐式转换)为函数指针,但情况并非总是如此。

参见编译器注释:

注意:如果闭包不捕获任何变量,则只能强制转换为

fn
类型

特别是:

cron_orchestrator.add_new_service(Service::new(|| Box::pin(fun3(person)) ));

闭包正在捕获对

person
的引用,并创建一个带有状态的闭包(它不仅仅是一个简单的函数,它是有状态的)。


一种可能性是对特征使用动态调度

Fn
(这是涵盖函数和闭包的特征)。

一个最小的例子:

type Service<T> = Box<dyn Fn() -> ServiceResponse<T>>;

A

Service
这里是一个通用动态类型(可以是任何实现
Fn
的类型)。

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=34960188f7f5d041067b452ad9a1b3aa


奖励:因为您的

CronOrchestrator::run
不会“消耗”您需要的服务
Fn
特征,因为该函数可能会调用多次。

也许您可以使用

FnOnce
稍微修改您的代码,因为每个应用程序初始化仅调用一次该服务。

© www.soinside.com 2019 - 2024. All rights reserved.