我的函数foo
定义如下:
fn foo<'a>(a: &'a i32, b: &i32) -> &'a i32 { a }
我想在结构中存储指向该函数的指针:
struct S {
f: fn(a: &i32, b: &i32) -> &i32,
}
因为有两个输入生命周期,所以无法推断结果生命周期:
error[E0106]: missing lifetime specifier
|
2 | f: fn(a: &i32, b: &i32) -> &i32,
| ^ expected lifetime parameter
|
= help: this function's return type contains a borrowed value,
but the signature does not say whether it is borrowed from a or b
当我向编译器询问foo
的类型时,它也不是很有用:
let () = foo;
给了我
expected type `fn(&'a i32, &i32) -> &'a i32 {foo}`
这显然不起作用,因为'a
没有在任何地方定义。
那么如何在此上下文中声明生命周期?尝试其中一个
f: fn<'a>(a: &'a i32, b: &i32) -> &'a i32
f<'a>: fn(a: &'a i32, b: &i32) -> &'a i32
导致语法错误,我找不到涵盖这种特定情况的文档。
答案 0 :(得分:3)
定义结构的生命周期:
fn foo<'a>(a: &'a i32, b: &i32) -> &'a i32 { a }
struct S<'b, 'c> {
f: fn(a: &'b i32, b: &'c i32) -> &'b i32,
}
fn main() {
S {
f: foo,
};
}
请注意,在此上下文中,您无法忽略第二个生命周期。
但是这意味着
(s.f)(&x, &y)
的调用不再是a
和b
的生命周期,不像foo(&x, &y)
然后你想要higher-rank trait bounds (HRTBs):
fn foo<'a>(a: &'a i32, _b: &i32) -> &'a i32 { a }
struct S<F>
where for <'b, 'c> F: Fn(&'b i32, &'c i32) -> &'b i32,
{
f: F,
}
fn main() {
S {
f: foo,
};
}