2015-01-17 61 views
3

我剛開始學習Rust,我在想是否有辦法重載方法。 起初我創建了一個結構並使用'impl'來實現基本的'new'方法。然後我想用一些參數添加'新'方法,並且我嘗試使用這個特性。如何重載'新'方法?

以下代碼已成功編譯,但是一旦我嘗試使用帶有params的'new',編譯器給了我一個關於額外參數的錯誤。 那麼我應該如何在Rust中重載方法?

pub struct Words<'a> { 
    pub nouns: Vec<&'a str>, 
} 

trait Test<'a>{ 
    fn new(nouns: Vec<&'a str>) -> Self; 
} 

impl<'a> Words<'a> { 
    pub fn new() -> Words<'a>{ 
     let nouns = vec!["test1", "test2", "test3", "test4"]; 
     Words{ nouns: nouns } 
    } 

    pub fn print(&self){ 
     for i in self.nouns.iter(){ 
      print!("{} ", i); 
     } 
    } 
} 

impl<'a> Test<'a> for Words<'a> { 
    fn new(nouns: Vec<&'a str>) -> Words<'a>{ 
     Words{ nouns: nouns } 
    } 
} 

回答

4

鏽確實通過特質超載,但你不能改變參數的數量和類型,只能改變,如果他們被宣佈爲普通上的特徵定義首位。

在像你這樣的情況下,這是常見的有像new_with_nouns的方法,專門你的意思:

impl<'a> Words<'a> { 
    fn new() -> Words { /* ... */ } 
    fn new_with_nouns(nouns: Vec<&'a str>) -> Words<'a> { /* ... */ } 
} 

對於更復雜的數據結構,其中new_with_something模式將導致組合爆炸,生成器模式是常見的(在這裏我假設Wordsseparator場,只是爲了演示):

struct WordsBuilder<'a> { 
    separator: Option<&'a str>, 
    nouns: Option<Vec<&'a str>>, 
} 

impl<'a> WordsBuilder<'a> { 
    fn new() -> WordsBuilder<'a> { 
     WordsBuilder { separator: None, nouns: None } 
    } 

    fn nouns(mut self, nouns: Vec<&'a str>) -> WordsBuilder<'a> { 
     self.nouns = Some(nouns); 
     self 
    } 

    fn separator(mut self, separator: &'a str) -> WordsBuilder<'a> { 
     self.separator = Some(separator); 
     self 
    } 

    fn build(self) -> Words<'a> { 
     Words { 
      separator: self.separator.unwrap_or(","), 
      nouns:  self.nouns.unwrap_or_else(|| { 
       vec!["test1", "test2", "test3", "test4"] 
      }) 
     } 
    } 
} 

這類似於如何stdlib's thread::Builder作品,對於考試PLE。

+0

謝謝!我懂了。 –