2016-12-31 60 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。 –