728x90
다형성
일반적인 타입으로 매개변수 화 할 수 있어 여러 구체화된 정의를 갖을 수 있다.
struct Pair<T> {
first: T,
second: T
}
위의 코드 예제를 보면 T부분에 int, str 어떤 것이 와도 상관이 없다. 이를 제네릭 함수라고 부른다.
let magic_pair: Pair<u32> = Pair { first: 7, second: 42 };
let pair_of_magicians: Pair<&str> = Pair { first: "Gandalf", second: "Sauron" };
일반화 된 만큼 함수의 일반화도 중요하다.
fn second<T>(pair: Pair<T>) {
pair.second; // 2번째 인수를 꺼내는 함수
}
let a = second(magic_pair); // 호출
오류처리
스레드가 모든 리소스를 해제하고 메시지를 보고한 뒤 프로그램을 종료시켜준다.
Panic! : 조건이 참일 경우 발생
if (y == 0) { panic!("Division by 0 occurred, exiting"); }
assert! : 조건이 참이 아닐 경우 발생
assert!( x == 5, "x is not equal to 5!");
assert_eq!(x, 5);
구조체에서의 메서드
impl 블록을 통해 구조체의 메서드를 정의 할 수 있다.
struct Alien {
health: u32,
damage: u32
}
impl Alien {
fn new(mut h: u32, d: u32) -> Alien {
// 제약사항
if h > 100 { h = 100; }
Alien { health: h, damage: d }
}
}
let mut berserk = Alien::new(150, 15); // 호출
struct 이름과 impl 이름을 똑같이 하면 구조체의 인스턴스들을 가져와 self키워드를 통해 사용할 수 있다.
fn attack(&self) { // &mut self
println!("I attack! Your health lowers with {} damage points.", self.damage);
}
트레잇
인터페이스나 슈퍼 클래스와 유사하다
아래와 같은 코드에서 attack메서드를 정의하지 않으면 오류 메시지를 발생시킨다.
trait Monster {
fn attack(&self);
}
impl Monster for Zombie {
}
#[derive(Debug)] : 오버라이딩되지 않은 메서드의 기본 코드가 자동으로 생성된다.
#[derive(Debug)]
struct Zombie { health: u32, damage: u32 }
트레잇 상수 사용하기
728x90
댓글