Rust로 CLI 도구 만들며 배운 소유권 개념
배경
팀 내부에서 쓸 파일 검색 CLI를 만들 일이 생겼다. Node.js로 후딱 만들 수도 있었지만, 요즘 관심 있던 Rust로 시도해봤다. 실행 속도보다는 학습이 목적이었다.
소유권과의 첫 만남
파일 경로 리스트를 필터링하는 간단한 코드에서 막혔다.
fn filter_files(paths: Vec<String>) -> Vec<String> {
let filtered = paths.iter()
.filter(|p| p.ends_with(".rs"))
.collect();
println!("Total: {}", paths.len()); // error: value borrowed here after move
filtered
}
paths를 iter()로 소비한 후 다시 쓰려니 컴파일 에러가 났다. 처음엔 답답했지만, 컴파일러가 정확히 어디서 왜 문제인지 알려줘서 고칠 수 있었다.
let filtered: Vec<String> = paths.iter()
.filter(|p| p.ends_with(".rs"))
.cloned()
.collect();
배운 점
- 빌림(
&)과 소유권 이동의 차이를 몸으로 익혔다 - 컴파일 타임에 메모리 안전성을 보장하는 게 이런 느낌이구나 싶었다
- String vs &str 차이도 실수하며 배웠다
속도는 체감할 정도는 아니었지만, 작성하면서 메모리를 의식하게 되는 경험이 신선했다. 당분간은 사이드 프로젝트용으로 계속 써볼 예정이다.
참고
- The Rust Book 4장이 소유권 개념 이해에 도움됐다
- clap 크레이트로 CLI 인자 파싱은 쉽게 처리했다