2016-08-07 32 views
1

我正在嘗試使兩個不同類型的適配器執行相同的工作,但我無法重寫這兩種類型。「在當前範圍中找不到類型T的方法」當包裝類型時

X有一個消耗self的方法,所以運行時多態包裝器不適用。唯一的選擇是靜態通用方法。

struct X {} 

impl X { 
    fn f(self, n: i32) { 
     println!("n = {}", n); 
    } 
    fn new() -> X { 
     X {} 
    } 
} 

struct AdapterX { 
    x: X 
} 

impl AdapterX { 
    fn uf(self, n: i32) { 
     self.x.f(n) 
    } 
    fn new(x: X) -> AdapterX { 
     AdapterX { x: x } 
    } 
} 

fn useAdapted<T>(a: T) { 
    a.uf(10) 
} 

fn main() { 
    let x = X::new(); 
    useAdapted::<AdapterX>(AdapterX::new(x)); 
} 

編譯器失敗:

error: no method named `uf` found for type `T` in the current scope 
    a.uf(10) 
     ^~ 

回答

0

我能弄清楚;包裝器結構是不需要的。正確的方法是一個通用的特徵。我也錯過了泛型類型變量的類型範圍。

struct X {} 

impl X { 
    fn f(self, n: i32) { 
     println!("n = {}", n); 
    } 
    fn new() -> X { 
     X {} 
    } 
} 

trait Adapter<T> { 
    fn uf(self, n: i32); 
} 

impl Adapter<X> for X { 
    fn uf(self, n: i32) { 
     self.f(n) 
    } 
} 

struct Y {} 

impl Y { 
    fn g(self, n: f32) { 
     println!("m = {}", n); 
    } 
    fn new() -> Y { 
     Y {} 
    } 
} 

impl Adapter<Y> for Y { 
    fn uf(self, n: i32) { 
     self.g(n as f32) 
    } 
} 

fn use_adapted<A, T: Adapter<A>>(a: T) { 
    a.uf(10) 
} 

fn main() { 
    use_adapted(X::new()); 
    use_adapted(Y::new()); 
} 
3

的問題是在這裏:

fn useAdapted<T>(a: T) { 
    a.uf(10) 
} 

這是說

給我任何可能類型,我會打電話給uf方法就可以了

這顯然是無稽之談,因爲你可以通過StringboolHashMapFile或....(你明白了)。

沒有方法uf適用於類型,所以編譯器告訴你這樣。正如您發現的那樣,您必須提供帶有一個或多個性狀的泛型類型的結合。這些特徵的方法和相關功能將在方法內部使用。

另請注意,鏽的風格是snake_case;該功能應稱爲use_adapted

+0

你怎麼設定這個界限? – mjwrazor

+0

@mjwrazor如果你向下滾動一下,你會看到[OP引入了一個特徵並將其用作綁定](http://stackoverflow.com/a/38813039/155423)。 – Shepmaster

相關問題