Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

중복 트레이트 명확화

하나의 타입은 여러 개의 서로 다른 트레이트를 구현할 수 있습니다. 만약 두 트레이트가 함수에 대해 동일한 이름을 요구한다면 어떨까요? 예를 들어, 많은 트레이트가 get()이라는 이름의 메서드를 가질 수 있습니다. 심지어 반환 타입이 다를 수도 있습니다!

좋은 소식은, 각 트레이트 구현이 자신만의 impl 블록을 가지기 때문에, 어떤 트레이트의 get 메서드를 구현하고 있는지 명확하다는 것입니다.

그럼 그 메서드들을 _호출_해야 할 때는 어떨까요? 이들 사이의 모호함을 없애기 위해, 우리는 ’완전한 정규화 구문(Fully Qualified Syntax)’을 사용해야 합니다.

trait UsernameWidget {
    // 이 위젯에서 선택된 사용자 이름을 가져옵니다
    fn get(&self) -> String;
}

trait AgeWidget {
    // 이 위젯에서 선택된 나이를 가져옵니다
    fn get(&self) -> u8;
}

// UsernameWidget과 AgeWidget을 모두 포함하는 폼
struct Form {
    username: String,
    age: u8,
}

impl UsernameWidget for Form {
    fn get(&self) -> String {
        self.username.clone()
    }
}

impl AgeWidget for Form {
    fn get(&self) -> u8 {
        self.age
    }
}

fn main() {
    let form = Form {
        username: "러스타시안(rustacean)".to_owned(),
        age: 28,
    };

    // 이 줄의 주석을 해제하면 "multiple `get` found"라는 에러가 발생합니다.
    // 결국 `get`이라는 이름의 메서드가 여러 개 있기 때문입니다.
    // println!("{}", form.get());

    let username = <Form as UsernameWidget>::get(&form);
    assert_eq!("러스타시안(rustacean)".to_owned(), username);
    let age = <Form as AgeWidget>::get(&form);
    assert_eq!(28, age);
}

참고:

러스트 프로그래밍 언어의 완전한 정규화 구문 장