4~5장 정리(재상)
- Generic 타입: 기존 C++ template, golang generic과 동일
임의의 타입을 변수처럼 취급해놓고, 타입을 지정하는 순간 해당 타입으로 실체화, 컴파일
- null 대신
None
, 기존 null보다 좀 더 안전한가봄.
근데 진짜 enum union 계속 쓰는건가? nullable type 표현용이 아니라면 정떨어지는데…
Nullable Type을 표현하기 위한 방법으로 Option<T>
가 기본제공됨.
- 언어가 기본 제공하는 Generic type 중
Result<T, E>
가 있음.
함수의 수행 결과가 정상적이면 T
를 Ok()
로 호출, 아니면 Err()
를 호출
참고로 main()
도 Result<T, E>
를 반환할 수 있음 (return 1 느낌인듯)
- 함수 호출 뒤에
?
를 붙임으로서 Graceful Error Handling이 가능하다. (이게 Graceful?)
Result
타입으로 반환하는 함수를 호출할 때,
정상적이면 바로 expression으로 취급할지, 아님 해당 함수에서 Err를 반환할지 결정 가능하다.
- Option, Result를 사용하면
.unwrap()
으로 값과 결과를 바로 가져올 수 있음.
- 기존 C++ vector와 동일한 방식으로
Vec
을 사용할 수 있음.
선언과 동시에 값을 집어넣고 싶으면 vec![]
으로 선언하면 됨.
iteration은 벡터에 .iter()
으로 for문을 돌리면 됨
- 변수를 초기화하고 바인딩을 하면 내부적으로 메모리를 할당하게 된다. 이 때, 바인딩 된 변수를 리소스의 owner라 한다.
- 변수의 수명은 보통 괄호가 기준이고, 괄호가 넘어가면 수명이 종료된다. (이걸 drop된다 한다.)
러스트는 GC가 없으며, 변수 선언과 자원 할당이 동시에 이뤄지는 C++의 RAII와 같다.
- 구조체 drop의 순서는 밖에서 안으로 들어간다. (구조체 밖이 먼저 해제, 멤버가 그 다음에)
- 함수 호출할 때 인자를 전달하게 되면, 인자로 전달한 ownership이 함수로 넘어간다. (move)
- 함수 내부에서 외부로 호출하면 ownership을 caller로 넘긴다.
- ownership을 완전히 넘기는게 아니라, 빌리고 싶다면,
&
으로 레퍼런스로 넘기면 된다.