14 Traits
trait
은 메소드의 모음으로 알 수 없는 타입에 정의된다:Self
. 이들은 동일 trait에 선언된 다른 메소드에 접근할 수 있다.
Trait은 모든 데이터 타입에 구현될 수 있다. 아래 예제에서, 우리는 Animal
을 정의하고, 메소드의 그룹을 만든다. Animal
trait
이 Sheep
데이터 타입으로 구현되어, Sheep
으로서 Animal
의 메소드를 사용할 수 있게 해준다.
struct Sheep { naked: bool, name: &'static str } trait Animal { // 정적 메소드 선언; `Self`는 구현자 타입을 참조한다. fn new(name: &'static str) -> Self; // 동적 메소드 선언; 이들은 string을 반환 할 것이다. fn name(&self) -> &'static str; fn noise(&self) -> &'static str; // Trait은 메소드의 기본 정의를 제공할 수 있다. fn talk(&self) { println!("{} says {}", self.name(), self.noise()); } } impl Sheep { fn is_naked(&self) -> bool { self.naked } fn shear(&mut self) { if self.is_naked() { // 구현자 메소드는 구현자의 trait 메소드를 사용할 수 있다. println!("{} is already naked...", self.name()); } else { println!("{} gets a haircut!", self.name); self.naked = true; } } } // `Animal` trait을 `Sheep`에 구현. impl Animal for Sheep { // `Self`는 구현자 타입 : `Sheep` fn new(name: &'static str) -> Sheep { Sheep { name: name, naked: false } } fn name(&self) -> &'static str { self.name } fn noise(&self) -> &'static str { if self.is_naked() { "baaaaah?" } else { "baaaaah!" } } // 기본 trait 메소드는 재정의 될 수 있다. fn talk(&self) { // For example, we can add some quiet contemplation. println!("{} pauses briefly... {}", self.name, self.noise()); } } fn main() { // 이 경우에는 타입 주해가 필요하다. let mut dolly: Sheep = Animal::new("Dolly"); // TODO ^ 타입 주해를 제거해보세요. dolly.talk(); dolly.shear(); dolly.talk(); }