2015-12-17 65 views
4

特質我有一個功能的特點,這並不需要self作爲參數:調用靜態方法從泛型類型

trait MyTrait { 
    fn function(x: i32) -> i32; 
} 

struct Dummy; 

impl MyTrait for Dummy { 
    fn function(x: i32) -> i32 { 
     x * 2 
    } 
} 

fn call_method<T: MyTrait>(object: T) { 
    let x = object.function(2); 
} 

fn main() {} 

庫的用戶需要實現的特質對任何類型的,通常一個空的結構。我的一個函數接受一個實現MyTrait的泛型類型。當我嘗試調用function方法的泛型類型,它給了我這個錯誤:

error: no method named function found for type T in the current scope

我試圖在回答解決this question,但我得到了同樣的錯誤。我如何調用泛型類型的靜態方法?

回答

6

When I try to call the function method on the generic type, ...

兩件事情:首先,這取決於你想如何看待它,function不是的方法。這只是一個發生在特徵名字空間中的函數(也是如此,是一個「關聯函數」)。

其次,你不是試圖調用function上的類型,你調用它的類型的值。這是不可能的,因爲它不是一種方法;它沒有self參數。

的解決方案是實際上呼叫泛型類型的function相關的功能,它看起來像這樣:

fn call_method<T: MyTrait>(object: T) { 
    let x = T::function(2); 
} 

有時候,這是不夠具體。如果您需要更具體的,你可以上面寫爲:

fn call_method<T: MyTrait>(object: T) { 
    let x = <T as MyTrait>::function(2); 
} 

兩個在語義上相同;只是當你有很多特質參與時,第二個更具體,更有可能解決。