2014-01-10 1 views
11

:특성과 구현 나는 다음과 같은 유형이

trait Monster { 
    fn attack(&self); 
    fn new(int) -> Self; 
} 

struct CookiesMonster { 
    cookies: int, 
    hungry_level: int, 
} 

impl Monster for CookiesMonster { 
    fn new(i: int) -> CookiesMonster { 
     CookiesMonster { cookies: i, hungry_level: i + 1 } 
    } 

    fn attack(&self) { 
     println!("I have {:d} cookies!!", self.cookies) 
    } 
} 

struct Dummy { 
    count: int 
} 

impl Dummy { 
    fn new(i: int) -> Dummy { 
     Dummy { count: i } 
    } 
} 

지금,이 작품 :

let monster: CookiesMonster = Monster::new(10); 
let dummy = Dummy::new(10); 

그러나 이것은하지 않습니다 :

let monster = CookiesMonster::new(10); 

왜 못해 CookiesMonster 형식에서 직접 새 메서드를 호출합니까?

답변

7

참고 이러한 맥락에서

trait Newable { 
    fn new(int) -> Self; 
} 

impl Newable for CookiesMonster { 
    fn new(i: int) -> CookiesMonster { 
     CookiesMonster { cookies: i, hungry_level: 0 } 
    } 
} 

을, Monster::new은 여전히 ​​작동하지만 CookiesMonster::new은 모호합니다.

(이 예에서는. 형질의 구현 타입 추론에 따라 사용할있는 방법 같은 Trait::<for Type>::static_method 명시 적으로 자신의 의도를 기록하는 방법으로 논의 된 일반화 된 구문 인물,하지만 확실하지 않다 얼마나 먼가?)

2014 년 7 월 15 일 경 업데이트 : "통합 기능 호출 구문"제안서는 이전 단락에서 언급 한 작업을 추적합니다. Rust RFC PR 132을 참조하십시오. 제 생각에 그 RFC에 설명 된 UFCS는 Monster이 (1.)가 new 메소드를 제공하고 CookiesMonster에 대해 명확하게 구현 된 범위의 유일한 특성 인 경우 CookiesMonster::new을 작성할 수 있습니다.

+2

내 답변에이 문제를 언급 한 것으로 간주했지만, 일단 "self"에 대한 메서드를 고려하기 시작하면이 "feature"가 사라집니다. 둘 다'frob (& self)'를 정의하는 두 가지 (범위 내) 특성을 가지고 있다면'obj.frob()'는 분리 된 형질에서 왔음에도 모호합니다. 그래서 나는 이것이 정말로 중요하다는 것을 확신하지 못합니다. –

+0

CookiesMonster :: new가 왜 모호한 지 이해할 수 없습니다. 그것이 나에게 무엇이 할 것인지 꽤 명확하게 보인다. 편집 : 알았어, 이제 더 이해가 되네. –

+0

@KevinBallard 사실,이 경우 컴파일러는 "오류 : 여러 적용 가능한 메소드"라고 말합니다. 다음은 예입니다 https://gist.github.com/nata79/8372600 –

10

특성이 현재 어떻게 작동하는지 알아보기 때문에. 형질의 정적 방법은 형질을 구현하는 사람이 아니라 형질에 대해 호출되어야합니다. 당신이 당신의 예에 다음 코드를 추가 한 경우 고려 : 형질에 대신의 특성을 구현하는 유형의 메소드를 호출하는 것은이 같은 경우가 모호 할 수 있다는