我正在尝试将函数存储在结构中:
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<'_>>}`
当你写的时候f1::<B>
,编译器将其解释为f1::<B<'_>>
, there '_
是编译器推断的生命周期,因为B
在整个生命周期内是通用的,您只能将具体类型作为类型参数传递。
但随后,在D
, the f
字段预计是一个接受引用的函数A
与任何一生。f1::<B>
不满足该要求,因为该函数已使用特定的生命周期进行实例化。
不幸的是,目前还没有办法做到这一点。 Rust 必须支持其中之一高等类型 https://en.wikipedia.org/wiki/Kind_%28type_theory%29 or 关联类型构造函数 https://internals.rust-lang.org/t/blog-post-series-alternative-type-constructors-and-hkt/4300。然后你可以定义E
in f1
成为类型构造函数参数,而不是类型参数(尽管我想知道编译器将如何处理'a
寿命参数)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)