2015-01-17 1 views
3

나는 방금 녹을 배우기 시작했고, 방법이 과부하되는 방법이 있는지 궁금해하고 있습니다. 처음에는 구조체를 만들고 기본 '새'메서드를 구현하는 데 'impl'을 사용했습니다. 그런 다음 일부 매개 변수와 함께 '새로운'방법을 추가 할 생각이었고, 그 특성을 사용하려고했습니다.'새로운'방법을 과부하하는 법?

다음 코드는 성공적으로 컴파일되었지만 일단 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 같은 방법을 가지고하는 것이 일반적 다음 new_with_something 패턴이 조합 폭발로 이어질 것보다 복잡한 데이터 구조에 대한

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

, 빌더 패턴 (여기 난 그냥 보여주기 위해, 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

고맙습니다! 나는 그것을있어. –