我正在尝试将函数存储在结构中:
trait T<'a> {}
struct A {}
struct B<'a> {
a: &'a A
}
impl<'a> T<'a> for B<'a> {}
fn f1<'a, E: T<'a>>(a: &'a A) {}
struct D {
f: fn(&A)
}
fn main() {
let d = D { f: f1::<B> };
}
编译器抱怨:
error[E0308]: mismatched types
--> src/main.rs:18:20
|
18 | let d = D { f: f1::<B> };
| ^^^^^^^ expected concrete lifetime, found bound lifetime parameter
|
= note: expected type `fn(&A)`
= note: found type `fn(&A) {f1::<'_, B<'_>>}`
答案 0 :(得分:3)
当您编写f1::<B>
时,编译器会将其解释为f1::<B<'_>>
,'_
是编译器推断的生命周期,因为B
在一生中是通用的,而您只能将具体类型作为类型参数传递。
但是,在D
中,f
字段应该是一个接受A
对任何生命周期的引用的函数。 f1::<B>
不符合该要求,因为该函数已使用特定的生命周期进行实例化。
不幸的是,目前还没有办法让这项工作成功。 Rust必须支持higher kinded types或associated type constructors。然后,您可以在E
中将f1
定义为类型构造函数参数,而不是类型参数(尽管我想知道编译器如何处理'a
生命周期参数)。