2015-08-28 33 views
3

我怎樣才能‘加’一flatten()方法Option<U>,那樣只會類型檢查,當且僅當UOption<T>,或者更簡單地將其添加?到Option<Option<T>>天真,我想寫以下,根本不能編譯:生鏽,如何「加」'扁平化」,以選擇<Option<T>>?

impl Option<Option<T>> { 
    fn flatten(&self) -> Option<T> { 
     match self { 
      None => None, 
      Some(v) => v, 
     } 
    } 
} 

fn main() { 
    let x = Some(Some(1)); 
    let y = x.flatten(); 
    println!("{:?}", y); 
} 

回答

5

你不能寫固有的實現(你想要什麼),以類型,您沒有定義,因一致性(如果可以的話,你如何知道某人其他還沒有定義一種叫做flatten的東西?)。

相反,你需要用你想要的方法來定義和實現一個特徵。你想要的任何地方的方法,使用特點:

trait Flatten<T> { 
    fn flatten(self) -> Option<T>; 
} 

impl<T> Flatten<T> for Option<Option<T>> { 
    fn flatten(self) -> Option<T> { 
     match self { 
      None => None, 
      Some(v) => v, 
     } 
    } 
} 

fn main() { 
    let x = Some(Some(1)); 
    let y = x.flatten(); 
    println!("{:?}", y); 
} 

另外請注意,我改變了方法的主題從&selfself:你不能搬出借的(尤其不是一成不變的一個),所以參考self在這裏沒有什麼意義。