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;
}