我有以下代码:
struct Helper<F1: Fn()> {
f: F1,
}
struct User<F2: Fn()> {
h: Helper<F2>,
}
fn new_user<F3: Fn()>() -> User<F3> {
User {
// error: expected type parameter, found closure
h: Helper { f: || {} },
}
}
fn main(){}
所以
User
需要一个类型为F1的Helper<F1>
,在这种情况下由new_user
中的闭包指定。但是,这段代码编译失败,并显示错误消息expected type parameter, found closure
在new_user
中。据我所知(例如请参阅this link),这是因为在new_user
上类型参数F3
的限制是由调用者(或签名?)指定的,因此尽管闭包实现了Fn()
特征,它将无法限制类型参数F3以匹配闭包的类型。相反,期望new_user
能够适用于任何给定的F3
,而它显然不会。那么我的问题是:我该如何解决这个问题?有没有一种表达方式,可以让
new_user
返回一个User
,其中F2
设置为闭包的类型?我尝试使用类型推断占位符:
// error: the type placeholder `_` is not allowed within types on item signatures
fn new_user() -> User<_> {
User {
h: Helper { f: || {} },
}
}
我可以使用Box,但这需要修改Helper
,在我的实际情况下并不理想:
struct Helper {
f: Box<dyn Fn()>,
}
struct User {
h: Helper,
}
fn new_user() -> User {
User {
h: Helper { f: Box::new(|| {}) },
}
}
fn main(){}
我也在尝试用自定义特质替换Fn()
,这样我就可以为User
实现特定的功能,但目前还有些笨拙。
有什么建议吗?