logo MSJO.kr

Rust Generics, Lifetimes

2020-04-14
MsJ

Rust에서 제너릭 데이터 타입 사용법을 간단하게 살펴보고 또한 Rust에서 모든 참조는 Lifetime을 갖는 데 이 부분에 있어 다른 개발 언어와 약간 독특한 문법을 가지고 있어서 간단한 예제로 정리하였다. 어떠한 객체가 있고 이를 가리키는 참조가 있다면 객체가 삭제되었는데 참조가 여전히 존재하는 경우를 해결하는 방법이라고 생각하자.

// 기본 참조 예제
fn main() {
    let mut var1 = 10;
    let mut var2 = 20;
    let mut var3 = 0;
    get_int_ref(&mut var1, &mut var2, &mut var3);
    println!("{} + {} = {}", var1, var2, var3);
}

fn get_int_ref(p1: &mut i32, p2: &mut i32, p3: &mut i32) {
    *p1 = *p1 + 1;
    *p2 = *p2 - 1;
    *p3 = *p1 + *p2;
}
Lifetime 예제
fn main() {
    let mut var1 = 10;
    let mut var2 = 20;
    let result = get_int_ref(&mut var1, &mut var2);
    println!("{}", result);
}

fn get_int_ref<'a>(p1: &'a i32, p2: &'a i32) -> &'a i32 {
    if p1 > p2 {
        return p1;
    } else {
        return p2;
    }
}
fn main() {
    let mut var1 = 10;
    let mut var2 = 20;
    let mut var3 = 0;
    let result_ref = get_int_ref(&mut var1, &mut var2, &mut var3);
    println!("{} + {} = {}", result_ref.0, result_ref.1, result_ref.2);
}

fn get_int_ref<'a>(p1: &'a mut i32, p2: &'a mut i32, p3: &'a mut i32) 
    -> (&'a i32, &'a i32, &'a i32) 
{
    *p3 = *p1 + *p2;
    return (p1, p2, p3);
}
Generic 예제
struct SimpleStruct {
    something: i32,
}

trait SimpleTrait {
    fn simple_func(&self, a: &str, b: &str) -> String;
}

impl SimpleTrait for SimpleStruct {
    fn simple_func(&self, a: &str, b: &str) -> String {
        return self.something.to_string() + " - " + a + " - " + b;
    }
}

impl SimpleTrait for i32 {
    fn simple_func(&self, a: &str, b: &str) -> String {
        return self.to_string() + " - " + a + " - " + b;
    }
}

fn do_this<T>(some_var: &T) -> String where T: SimpleTrait,
{
    return some_var.simple_func("가나닭", "마바삵");
}

fn main() {
    let test = SimpleStruct { something: 1000 };
    let result = do_this(&test);
    println!("{}", result);

    let test32 = 1234;
    let result2 = do_this(&test32);
    println!("{}", result2);

    println!("{} + {} = {}", 1.1, 2.2, func1(1.1, 2.2) as f32);
}

fn func1<T>(input_a: T, input_b: T) -> T
where T: std::ops::Add<Output = T> + std::fmt::Debug,
{
    return input_a + input_b;
}
Reference

Prεv(Θld)   Nεxt(Nεw)
Content
Search     RSS Feed     BY-NC-ND