rust를 이용하여 전통적인 방식으로 None 검사가 가능 하긴 하다.
struct MyBag<T> {
item: Option<T>,
}
fn main() {
let bag = MyBag::<i32> { item: None };
if bag.item.is_none() {
println!("Not exises");
}
if !bag.item.is_some() {
println!("Not found something");
}
match bag.item {
Some(v) => println!("Found {}!", v),
None => println!("Nothing"),
}
}
간단히 값이 있는지 없는지 검사만 한다면 문제가 없을 듯 하다. 하지만 이를 활용하여 unwarp으로 처리 하는 악용 사례가 발생 할 수 있을 것이다.
unwrap은 Option/Result 내부의 값을 꺼내온다. 만약 enum의 값이 None/Err인 상태에서 unwrap을 호출할 경우 panic!이 발생한다. 이를 피하기 위해 is_some, is_none으로 먼저 검사가 필요할 것이다.
struct MyBag<T> {
item: Option<T>,
}
fn main() {
let bag = MyBag::<i32> { item: Some(32i32) };
//let bag = MyBag::<i32> { item: None };
if !bag.item.is_some() {
let v = bag.item.unwrap();
println!("found something {v}");
}
}
작성된 코드는 전통적인 null 검사와 다를것이 없어 보인다. is_none, is_some을 사용 하더라도 unwarp()을 사용하는 것은 지양해야 할 것 같다.
빠르게 디버깅 해야 할 경우에는 Option/Result를 쓰는 것은 귀찮은 일일 수 있다.
이럴때 unwarp이라는 함수를 사용하면 빠르지만 위험한 방식으로 값을 가져올 수 있을 것이다.