2017-10-06 104 views
3

我很困惑通過下面的代碼(Listing 13-9):如何定義一個帶參數和返回類型的特徵,如Fn?

struct Cacher<T> 
where 
    T: Fn(i32) -> i32, 
{ 
    calculation: T, 
    value: Option<i32>, 
} 

我明白Fn是一個特點,但通常一個特點沒有參數和返回類型。我如何定義像Fn這樣的特徵?

我想看看at the definition(實際上這是FnOnce,但FnFnMut約束和FnMutFnOnce束縛...),但我仍然感到困惑。 <Args>是什麼意思?那麼也something written about it in the Nomicon;但我不明白:

哪裏Fn(a, b, c) -> d本身就是不穩定真正Fn特質

回答

5

只是糖我如何定義帶有參數的特徵和返回類型,如FN?

如果您的意思是語法MyTrait(A) -> B,您不能。具有「參數」和「返回類型」的特徵是特殊的,並且限於Fn,FnMutFnOnce特徵。這是硬編碼到編譯器中的。甚至還有一個特定的錯誤消息是:

error: parenthetical notation is only stable when used with `Fn`-family traits (see issue #29625) 
--> src/main.rs:5:8 
    | 
5 |  A: MyTrait(A) -> B, 
    |  ^^^^^^^^^^^^^^^ 

話雖這麼說,這句法desugars到標準特徵語法。你可以看到什麼FnOnce是從文檔:

pub trait FnOnce<Args> { 
    type Output; 
    extern "rust-call" fn call_once(self, args: Args) -> Self::Output; 
} 

編譯器轉換成Fn(A, B, C) -> ZFn<(A, B, C), Output = Z>Args是一個標準特徵泛型類型參數,並且Output是標準關聯類型。 ABI是一些內部編譯器機制,它使得這個機制更高效一些,大部分時間都可以忽略。

您完全可以使用通用參數和關聯類型創建自己的特徵。你只是不允許使用括號。

相關問題