void add_one(int* ptr) {
if (ptr == NULL) {
return
}
int data = 12;
printf("%d", *ptr + 12);
}
ptr이 null이든 null이 아니든 값이 있는것 처럼 사용할 수 있으며 런타임에 문제가 발생한다.
enum Option<T> {
Some(T),
None,
}
fn add_one(value: Option<i32>) -> Option<i32> {
match value {
None => None,
Some(i) => Some(i + 1)
}
}
match 키워드를 사용해서 값이 있는 경우에 대해서 처리 하도록 한다.
즉 개발자가 언어 상으로 반드시 None에 대한 처리를 하도록 강제한다.
그렇지 않고 전통적인 언어처럼 사용하려고 하면 다음과 같이 문제가 발생
let x: i8 = 5;
let y: Option<i8> = Some(5);
let sum = x + y; // error[E0277]: cannot add `std::option::Option<i8>` to `i8`
중요한 차이점은 타입이다.
null의 경우 값이 있든 없든 같은 타입으로 표현이 가능하다
int* ptr = &data;
ptr = NULL;
많은 코드와 파일을 지나간 후 ...
*ptr = 100; // 확실히 하기 위해서는 NULL 체크를 해야하지만 개발자가 생략 할 수 있다.
None의 경우 값이 있는 경우에 대해서만 반드시 처리하도록 강제한다
let data: Option<i8> = Some(5);
많은 코드가 지나간 후 ...
let sum = data + 12i8;//error가 발생한다.
8 | let sum = data + 12i8;
| ---- ^ ---- i8