2015-01-17 63 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

谢谢!我懂了。 –