2016-12-31 21 views
4

我有一个函数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 

当我问comp iler为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 

导致语法错误,而且我无法找到涵盖此特定情况的文档。

回答

2

定义的结构的寿命:

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, 
    }; 
} 

请注意,你不能在这方面的的Elid第二寿命。

但是,这将意味着,到(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, 
    }; 
} 
+0

但会意味着对''(sf)(&x,&y)'的调用在'a'和'b'的生命周期中不再是泛型的,与'foo(&x,&y)'不同。 –

+0

太棒了!我不了解HRTB。 –