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 인자 파싱은 쉽게 처리했다