在结构中指定函数指针类型的生命周期

时间:2016-12-31 14:28:17

标签: rust function-pointers lifetime

我的函数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

导致语法错误,我找不到涵盖这种特定情况的文档。

1 个答案:

答案 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)的调用不再是ab的生命周期,不像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,
    };
}